双链表

可以向前看的链表

单链表只能单向遍历,就像单向行驶的道路,无法回头。而双链表则给了我们"后悔的权利"。

双链表的每个节点除了指向下一个节点的指针,还有一个指向前一个节点的指针:

struct DoublyListNode {
    int val;
    DoublyListNode* prev;  // 指向前一个节点
    DoublyListNode* next;  // 指向下一个节点
    DoublyListNode(int x) : val(x), prev(nullptr), next(nullptr) {}
};

这个小小的改变带来了巨大的便利:

  1. 双向遍历:可以从头到尾,也可以从尾到头遍历
  2. 高效删除:删除指定节点时,不再需要知道前驱节点
  3. 方便回溯:在某些算法中特别有用

双链表的插入操作需要同时更新四个指针,但删除操作相对简单:

// 删除节点
void deleteNode(DoublyListNode* node) {
    if (node->prev != nullptr) {
        node->prev->next = node->next;
    }
    if (node->next != nullptr) {
        node->next->prev = node->prev;
    }
    delete node;
}

双链表在浏览器历史记录、撤销操作、音乐播放列表等场景中都有广泛应用。

posted @ 2026-01-02 19:45  f-52Hertz  阅读(22)  评论(0)    收藏  举报