用C++实现一个功能齐全的双向循环链表并加上详细的注释
时间: 2024-01-22 11:18:52 浏览: 87
以下是一个简单的双向循环链表的实现,附有详细的注释,使用 C++ 语言编写:
```cpp
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node* prev;
};
class DoublyLinkedList {
private:
Node* head;
public:
DoublyLinkedList() {
head = nullptr; // 初始化头指针
}
~DoublyLinkedList() {
while (head != nullptr) { // 逐一删除链表中的节点
Node* temp = head;
head = head->next;
delete temp;
}
}
void insertAtHead(int data) {
Node* newNode = new Node();
newNode->data = data;
newNode->prev = nullptr;
if (head == nullptr) { // 如果链表为空,插入的节点就是头节点
newNode->next = nullptr;
} else {
newNode->next = head; // 插入节点并更新指针
head->prev = newNode;
}
head = newNode;
}
void insertAtTail(int data) {
Node* newNode = new Node();
newNode->data = data;
newNode->next = nullptr;
if (head == nullptr) { // 如果链表为空,插入的节点就是头节点
newNode->prev = nullptr;
head = newNode;
return;
}
Node* temp = head;
while (temp->next != nullptr) { // 找到链表尾部
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
void deleteAtHead() {
if (head == nullptr) { // 链表为空,不需要删除
return;
}
Node* temp = head;
head = head->next;
if (head != nullptr) { // 更新指针
head->prev = nullptr;
}
delete temp;
}
void deleteAtTail() {
if (head == nullptr) { // 链表为空,不需要删除
return;
}
if (head->next == nullptr) { // 只有一个节点,直接删除
delete head;
head = nullptr;
return;
}
Node* temp = head;
while (temp->next != nullptr) { // 找到倒数第二个节点
temp = temp->next;
}
temp->prev->next = nullptr; // 删除最后一个节点并更新指针
delete temp;
}
void printList() {
Node* temp = head;
while (temp != nullptr) { // 逐一输出链表中的元素
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
};
int main() {
DoublyLinkedList list; // 创建一个双向循环链表
list.insertAtHead(1); // 在头部插入元素
list.insertAtHead(2);
list.insertAtTail(3); // 在尾部插入元素
list.printList(); // 输出链表中的元素
list.deleteAtHead(); // 删除头部元素
list.deleteAtTail(); // 删除尾部元素
list.printList(); // 输出链表中的元素
return 0;
}
```
注释已经尽可能详细地解释了代码的每一个细节,希望对你有所帮助!
阅读全文