定义节点结构体并创建双向链表类,通过append和prepend添加节点,正确维护前后指针,实现正向与反向遍历,最后在析构函数中释放内存。

在C++中创建双向链表,核心是定义一个节点结构体,其中包含数据域和两个指针:一个指向下一个节点(next),另一个指向前一个节点(prev)。然后通过动态分配内存(new)来添加节点,并正确维护前后指针的连接关系。
定义双向链表节点结构
每个节点需要存储数据以及前后节点的地址。使用struct可以方便地组织这些成员。
struct Node {
int data; // 数据域,可根据需要改为其他类型
Node* prev; // 指向前一个节点
Node* next; // 指向后一个节点
// 构造函数,便于初始化
Node(int value) : data(value), prev(nullptr), next(nullptr) {}};
创建空的双向链表类
封装操作逻辑,便于管理头尾指针和提供增删查改接口。
立即学习“C++免费学习笔记(深入)”;
class DoublyLinkedList {
private:
Node* head;
Node* tail;
public:
DoublyLinkedList() : head(nullptr), tail(nullptr) {}
// 插入节点到末尾
void append(int value) {
Node* newNode = new Node(value);
if (!head) {
head = tail = newNode;
} else {
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
}
}
// 插入节点到开头
void prepend(int value) {
Node* newNode = new Node(value);
if (!head) {
head = tail = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}
// 打印链表(从头到尾)
void displayForward() {
Node* current = head;
while (current) {
std::cout << current->data << " <-> ";
current = current->next;
}
std::cout << "nullptr" << std::endl;
}
// 打印链表(从尾到头)
void displayBackward() {
Node* current = tail;
while (current) {
std::cout << current->data << " <-> ";
current = current->prev;
}
std::cout << "nullptr" << std::endl;
}
// 析构函数清理内存
~DoublyLinkedList() {
Node* current = head;
while (current) {
Node* temp = current;
current = current->next;
delete temp;
}
}};
使用示例
下面是一个简单的main函数演示如何使用上述双向链表。
#includeusing namespace std; int main() { DoublyLinkedList dll; dll.append(10); dll.append(20); dll.prepend(5); dll.displayForward(); // 输出: 5 <-> 10 <-> 20 <-> nullptr dll.displayBackward(); // 输出: 20 <-> 10 <-> 5 <-> nullptr return 0; }
基本上就这些。只要注意指针赋值顺序,避免出现悬空或循环引用,双向链表就能稳定工作。常见错误包括忘记更新prev指针、删除节点时未释放内存等,开发时需特别留意。











