双链表
可以向前看的链表
单链表只能单向遍历,就像单向行驶的道路,无法回头。而双链表则给了我们"后悔的权利"。
双链表的每个节点除了指向下一个节点的指针,还有一个指向前一个节点的指针:
struct DoublyListNode {
int val;
DoublyListNode* prev; // 指向前一个节点
DoublyListNode* next; // 指向下一个节点
DoublyListNode(int x) : val(x), prev(nullptr), next(nullptr) {}
};
这个小小的改变带来了巨大的便利:
- 双向遍历:可以从头到尾,也可以从尾到头遍历
- 高效删除:删除指定节点时,不再需要知道前驱节点
- 方便回溯:在某些算法中特别有用
双链表的插入操作需要同时更新四个指针,但删除操作相对简单:
// 删除节点
void deleteNode(DoublyListNode* node) {
if (node->prev != nullptr) {
node->prev->next = node->next;
}
if (node->next != nullptr) {
node->next->prev = node->prev;
}
delete node;
}
双链表在浏览器历史记录、撤销操作、音乐播放列表等场景中都有广泛应用。
浙公网安备 33010602011771号