📅  最后修改于: 2023-12-03 14:59:48.600000             🧑  作者: Mango
链表(Linked List)是一种常见的数据结构,在C++中也有相应的实现。链表是由节点(Node)组成,每个节点包含数据(Data)和指向下一个节点的指针(Next)。相比于数组,在插入和删除操作上,链表的效率更高。
链表的每个节点可以通过自定义结构体或类来定义。例如,我们定义一个简单的链表节点结构体:
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
每个链表节点有一个整数值(val)和指向下一个节点的指针(next)。
要创建链表,我们需要创建节点并将它们连接起来。通常,我们会定义一个指向链表头节点的指针,以便于对链表的操作。以下是一个示例:
ListNode* createLinkedList(vector<int>& nums) {
ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
ListNode* curr = dummy; // 指向当前节点
for (int num : nums) {
curr->next = new ListNode(num); // 创建一个新的节点
curr = curr->next; // 移动到下一个节点
}
return dummy->next; // 返回链表的实际头节点
}
在上面的代码中,我们使用了一个虚拟头节点(dummy)来简化链表的操作。虚拟头节点的next
指针指向实际的头节点。
链表的遍历可以通过循环来实现。通常,我们使用一个指针(或迭代器)来遍历整个链表,直到指针到达链表末尾(即指针为空)。
以下是一个示例,展示了如何遍历链表并打印节点的值:
void traverseLinkedList(ListNode* head) {
ListNode* curr = head;
while (curr != nullptr) {
cout << curr->val << " ";
curr = curr->next;
}
}
在链表中插入一个新的节点通常有两种方式:在头部插入和在尾部插入。
要在链表头部插入一个新的节点,我们只需创建一个新的节点,并将其next
指针指向当前的头节点。以下是一个示例:
ListNode* insertAtHead(ListNode* head, int val) {
ListNode* newNode = new ListNode(val);
newNode->next = head;
return newNode; // 返回新的头节点
}
要在链表尾部插入一个新的节点,我们需要找到链表的末尾节点,然后将其next
指针指向新的节点。以下是一个示例:
void insertAtTail(ListNode* head, int val) {
ListNode* newNode = new ListNode(val);
ListNode* curr = head;
while (curr->next != nullptr) {
curr = curr->next;
}
curr->next = newNode; // 将新节点连接到链表末尾
}
删除链表中的一个节点通常有两种方式:删除指定值的节点和删除指定位置的节点。
要删除链表中指定值的节点,我们需要找到该节点,并将其前一个节点的next
指针指向其下一个节点。以下是一个示例:
ListNode* deleteNode(ListNode* head, int val) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* curr = dummy;
while (curr->next != nullptr) {
if (curr->next->val == val) {
ListNode* temp = curr->next;
curr->next = temp->next;
delete temp;
} else {
curr = curr->next;
}
}
return dummy->next;
}
要删除链表中指定位置的节点,我们需要找到该位置的前一个节点,并将其next
指针指向下一个节点。以下是一个示例:
ListNode* deleteNodeAtPos(ListNode* head, int pos) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* curr = dummy;
for (int i = 0; i < pos - 1; i++) {
curr = curr->next;
}
ListNode* temp = curr->next;
curr->next = temp->next;
delete temp;
return dummy->next;
}
链表是一种常见的数据结构,在C++中可以通过自定义结构体或类来实现。使用链表可以高效地进行插入和删除操作。本文介绍了如何定义链表节点、创建链表、遍历链表以及插入和删除节点的方法。
以上为C++中链表的简要介绍,希望对程序员们有所帮助。链表在算法和数据结构中有广泛的应用,进一步学习和掌握链表会对你的程序开发能力有所提升。