用C++实现一个双向循环链表并加上详细的注释
时间: 2024-01-22 11:18:50 浏览: 101
用C++实现的双向循环链表
以下是使用C++实现双向循环链表的代码,带有详细的注释:
```c++
#include <iostream>
// 定义双向循环链表节点结构体
struct Node {
int data; // 存储数据
Node* prev; // 指向前一个节点的指针
Node* next; // 指向后一个节点的指针
};
// 定义双向循环链表类
class DoublyLinkedList {
public:
// 构造函数
DoublyLinkedList() {
head = nullptr; // 初始化头指针为空
}
// 在链表末尾插入节点
void insert(int data) {
Node* newNode = new Node; // 创建新节点
newNode->data = data; // 设置新节点的数据
newNode->prev = nullptr; // 初始化新节点的前后指针为空
if (head == nullptr) { // 如果链表为空
head = newNode; // 将头指针指向新节点
head->next = head; // 新节点的后指针指向头节点形成循环
head->prev = head; // 新节点的前指针指向头节点形成循环
}
else { // 如果链表不为空
Node* temp = head; // 创建临时指针指向头节点
while (temp->next != head) // 遍历链表找到最后一个节点
temp = temp->next;
temp->next = newNode; // 将最后一个节点的后指针指向新节点
newNode->prev = temp; // 新节点的前指针指向最后一个节点
newNode->next = head; // 新节点的后指针指向头节点
head->prev = newNode; // 头节点的前指针指向新节点
}
}
// 在链表中删除节点
void remove(int data) {
if (head == nullptr) // 如果链表为空
return;
Node* temp = head; // 创建临时指针指向头节点
if (temp->data == data) { // 如果头节点就是要删除的节点
if (temp->next == head) { // 如果链表只有一个节点
head = nullptr; // 将头指针设为空
delete temp; // 删除节点
return;
}
else { // 如果链表有多个节点
head = temp->next; // 将头指针指向下一个节点
head->prev = temp->prev;// 下一个节点的前指针指向最后一个节点
temp->prev->next = head;// 最后一个节点的后指针指向下一个节点
delete temp; // 删除节点
return;
}
}
while (temp->next != head) { // 遍历链表找到要删除的节点
if (temp->next->data == data) {
Node* deleteNode = temp->next; // 创建临时指针指向要删除的节点
temp->next = deleteNode->next; // 将前一个节点的后指针指向要删除节点的下一个节点
deleteNode->next->prev = temp; // 将下一个节点的前指针指向要删除节点的前一个节点
delete deleteNode; // 删除节点
return;
}
temp = temp->next; // 指针后移
}
}
// 遍历链表并输出节点数据
void display() {
if (head == nullptr) // 如果链表为空
return;
Node* temp = head; // 创建临时指针指向头节点
std::cout << "List: ";
while (temp->next != head) { // 遍历链表并输出节点数据
std::cout << temp->data << " ";
temp = temp->next; // 指针后移
}
std::cout << temp->data << std::endl; // 输出最后一个节点的数据
}
private:
Node* head; // 头指针
};
int main() {
DoublyLinkedList list; // 创建双向循环链表对象
// 在链表末尾插入节点
list.insert(1);
list.insert(2);
list.insert(3);
list.display(); // 输出链表
// 在链表中删除节点
list.remove(2);
list.display(); // 输出链表
return 0;
}
```
上述代码实现了双向循环链表的插入、删除和遍历操作。其中,头指针指向链表的头节点,每个节点有一个前指针和一个后指针,指向前一个节点和后一个节点。在插入节点时,如果是第一个节点,则头指针指向该节点,该节点的前后指针都指向自身;如果不是第一个节点,则将该节点插入到链表的末尾。在删除节点时,先遍历链表找到要删除的节点,然后将该节点的前后指针分别指向下一个节点和上一个节点,最后删除该节点。在遍历链表时,需要注意链表为空的情况和最后一个节点的数据输出方式。
阅读全文