📅  最后修改于: 2023-12-03 15:22:51.724000             🧑  作者: Mango
双向链表是一种数据结构,它可以在任一位置高效地插入或删除元素,比起单向链表而言具有更加优越的功能。
双向链表每个节点有两个指针,分别为前驱指针和后继指针,这个指针的存在使得我们可以在任意节点高效地查找前一个或后一个节点。
双向链表的插入操作分为两种,分别为在表头插入和在表尾插入。具体实现代码如下:
class ListNode {
public:
int val;
ListNode *prev; // 前驱指针
ListNode *next; // 后继指针
ListNode(int x) : val(x), prev(nullptr), next(nullptr) {}
};
class LinkedList {
public:
ListNode *head; // 链表头指针
LinkedList() : head(nullptr) {}
// 在表头插入
void insertAtBeginning(int data) {
ListNode *newNode = new ListNode(data);
if (head != nullptr) {
head->prev = newNode;
}
newNode->next = head;
head = newNode;
}
// 在表尾插入
void insertAtEnd(int data) {
ListNode *newNode = new ListNode(data);
// 如果链表为空
if (head == nullptr) {
head = newNode;
} else {
// 找到链表尾部
ListNode *temp = head;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
}
};
在表头插入时,我们新建一个节点,将它的后续节点指向当前的头节点,把当前头节点的前驱指针指向新的节点。接着将链表头指针指向新的节点。在表尾插入时,我们新建一个节点,然后找到链表的最后一个节点,将最后一个节点的后继指针指向新的节点,新的节点的前驱指针指向最后一个节点。
以上就是双向链表的介绍和插入操作,可以在实际情况下灵活应用。