使用类在 C++ 中实现单向链表的程序
链表将数据存储在顺序存储中,就像数组一样。尽管数据是按顺序存储的,但存储位置并不连续。
与数组不同,链表可以存储不同数据类型的数据。
下图表示链表结构。
在 C++ 中,链表可以分别用一个类和一个Node类来表示,它有两个成员,即 data 和一个指向下一个节点的next指针。
InsertNode :在本文中,插入是在列表的末尾完成的。按照步骤在链表中插入节点。
- 假设要在现有链表上插入4 ,即1 -> 2 -> 3 。结果链表将是1 -> 2 -> 3 -> 4。
- 插入一个新节点,遍历到列表的末尾,直到找到 NULL 节点。
- 创建一个新节点,并将新节点链接到链表的最后一个节点。
DeleteNode :在本文中,删除是使用节点的索引完成的。请按照以下步骤删除节点:
- 如果要删除的节点是头节点,则将头存储在临时变量中。然后将head更新为head->next 。删除temp 。
- 如果要删除的节点的索引大于列表的长度,则从函数返回。
- 遍历直到要删除的节点。删除节点,并将前一个节点链接到被删除节点的下一个节点。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Node class to represent
// a node of the linked list.
class Node {
public:
int data;
Node* next;
// Default constructor
Node()
{
data = 0;
next = NULL;
}
// Parameterised Constructor
Node(int data)
{
this->data = data;
this->next = NULL;
}
};
// Linked list class to
// implement a linked list.
class Linkedlist {
Node* head;
public:
// Default constructor
Linkedlist() { head = NULL; }
// Function to insert a
// node at the end of the
// linked list.
void insertNode(int);
// Function to print the
// linked list.
void printList();
// Function to delete the
// node at given position
void deleteNode(int);
};
// Function to delete the
// node at given position
void Linkedlist::deleteNode(int nodeOffset)
{
Node *temp1 = head, *temp2 = NULL;
int ListLen = 0;
if (head == NULL) {
cout << "List empty." << endl;
return;
}
// Find length of the linked-list.
while (temp1 != NULL) {
temp1 = temp1->next;
ListLen++;
}
// Check if the position to be
// deleted is less than the length
// of the linked list.
if (ListLen < nodeOffset) {
cout << "Index out of range"
<< endl;
return;
}
// Declare temp1
temp1 = head;
// Deleting the head.
if (nodeOffset == 1) {
// Update head
head = head->next;
delete temp1;
return;
}
// Traverse the list to
// find the node to be deleted.
while (nodeOffset-- > 1) {
// Update temp2
temp2 = temp1;
// Update temp1
temp1 = temp1->next;
}
// Change the next pointer
// of the previous node.
temp2->next = temp1->next;
// Delete the node
delete temp1;
}
// Function to insert a new node.
void Linkedlist::insertNode(int data)
{
// Create the new Node.
Node* newNode = new Node(data);
// Assign to head
if (head == NULL) {
head = newNode;
return;
}
// Traverse till end of list
Node* temp = head;
while (temp->next != NULL) {
// Update temp
temp = temp->next;
}
// Insert at the last.
temp->next = newNode;
}
// Function to print the
// nodes of the linked list.
void Linkedlist::printList()
{
Node* temp = head;
// Check for empty list.
if (head == NULL) {
cout << "List empty" << endl;
return;
}
// Traverse the list.
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
// Driver Code
int main()
{
Linkedlist list;
// Inserting nodes
list.insertNode(1);
list.insertNode(2);
list.insertNode(3);
list.insertNode(4);
cout << "Elements of the list are: ";
// Print the list
list.printList();
cout << endl;
// Delete node at position 2.
list.deleteNode(2);
cout << "Elements of the list are: ";
list.printList();
cout << endl;
return 0;
}
输出
Elements of the list are: 1 2 3 4
Elements of the list are: 1 3 4
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。