golang,go,博客,开源,编程
双向链表(Doubly Linked List)是一种链式数据结构,与单向链表不同,双向链表中的每个节点不仅包含指向下一个节点的指针(即 next
),还包含指向前一个节点的指针(即 prev
)。这种结构使得在链表中进行双向遍历更加方便。
一个双向链表的节点通常包含以下三个部分:
prev
指针找到前一个节点,相对单向链表效率更高。 Head <-> Node1 <-> Node2 <-> Node3 <-> Tail
在这个示意图中:
Head
是链表的头节点。Tail
是链表的尾节点。next
和 prev
指针连接。#include <iostream>
using namespace std;
// 双向链表节点
struct Node {
int data; // 节点数据
Node* next; // 指向下一个节点
Node* prev; // 指向前一个节点
};
// 双向链表类
class DoublyLinkedList {
public:
Node* head; // 链表头指针
Node* tail; // 链表尾指针
DoublyLinkedList() {
head = nullptr;
tail = nullptr;
}
// 在尾部插入新节点
void append(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
newNode->prev = tail;
if (tail != nullptr) {
tail->next = newNode;
}
tail = newNode;
if (head == nullptr) {
head = newNode;
}
}
// 打印链表(从头到尾)
void printForward() {
Node* temp = head;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
// 打印链表(从尾到头)
void printBackward() {
Node* temp = tail;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->prev;
}
cout << endl;
}
};
int main() {
DoublyLinkedList list;
list.append(10);
list.append(20);
list.append(30);
cout << "Forward: ";
list.printForward();
cout << "Backward: ";
list.printBackward();
return 0;
}
希望这些内容能帮助你理解双向链表!如果有更具体的疑问或应用场景,欢迎继续提问。