编写使用双向链表的程序,其中实现左插入、右插入,删除,显示等链表的功能
时间: 2023-10-24 17:04:27 浏览: 122
好的,下面是使用双向链表实现左插入、右插入、删除和显示等功能的程序示例:
```C++
#include <iostream>
using namespace std;
// 双向链表节点
struct ListNode {
int val;
ListNode* prev;
ListNode* next;
ListNode(int x) : val(x), prev(NULL), next(NULL) {}
};
// 双向链表类
class LinkedList {
public:
LinkedList() {
head = new ListNode(-1);
tail = new ListNode(-1);
head->next = tail;
tail->prev = head;
}
// 左插入
void insertLeft(int val) {
ListNode* node = new ListNode(val);
node->prev = head;
node->next = head->next;
head->next->prev = node;
head->next = node;
}
// 右插入
void insertRight(int val) {
ListNode* node = new ListNode(val);
node->prev = tail->prev;
node->next = tail;
tail->prev->next = node;
tail->prev = node;
}
// 删除节点
void remove(ListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
delete node;
}
// 显示链表
void display() {
ListNode* cur = head->next;
while (cur != tail) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
ListNode* head; // 链表头节点
ListNode* tail; // 链表尾节点
};
int main() {
LinkedList list;
// 左插入示例
list.insertLeft(1);
list.insertLeft(2);
list.insertLeft(3);
list.display(); // 输出:3 2 1
// 右插入示例
list.insertRight(4);
list.insertRight(5);
list.insertRight(6);
list.display(); // 输出:3 2 1 4 5 6
// 删除示例
ListNode* node = list.head->next;
list.remove(node);
list.display(); // 输出:2 1 4 5 6
return 0;
}
```
以上程序中,我们定义了一个 `LinkedList` 类来实现双向链表,其中包含了左插入、右插入、删除和显示等功能。在双向链表的节点定义中,我们除了 `val` 值外,还定义了 `prev` 和 `next` 指针,用于指向节点的前驱和后继节点。在 `LinkedList` 类中,我们定义了头节点和尾节点,并在构造函数中将它们连接起来,形成一个空链表。接着,我们实现了左插入和右插入函数,它们分别在链表的头部和尾部插入一个新节点,并更新前驱后继指针。删除节点函数可以删除指定的节点,并更新前驱后继指针。最后,我们实现了一个 `display` 函数,用于遍历链表并输出每个节点的值。在 `main` 函数中,我们对 `LinkedList` 类进行了简单的测试,包括左插入、右插入和删除等操作,并输出了每次操作后的链表。
阅读全文