🐵指尖猴全新升级
第11课:双向链表
↔️

双向链表

前后都能走,双向通行更自由!

📖知识引入

🛤️双指针域
节点同时带prev和next,左手牵前驱右手牵后继
🔁双向遍历
既可从头走到尾,也能从尾走回头,单链表做不到
🎯O(1)删节点
给定位点,双向链表不用找前驱就能直接删,快人一步
⚖️代价
每个节点多存一个指针,内存开销更大,插入时要改的指针也更多
💡
C++ STL的list就是双向链表,掌握原理后再用它,知其然更知其所以然

🔍双向链表节点与插入

struct DNode {
    int val;
    DNode* prev;   // 指向前驱
    DNode* next;   // 指向后继
};

// 在 p 之后插入 s(四个指针都要改)
DNode* s = new DNode{99, nullptr, nullptr};
s->next = p->next;        // s 牵住后继
s->prev = p;              // s 牵住前驱
if (p->next != nullptr)
    p->next->prev = s;    // 原后继回牵 s
p->next = s;              // p 正式接上 s

双向链表插入要改四个指针,画好图再动手不迷路

🎯小测验

第1题:双向链表每个节点有几个指针域?

第2题:双向链表相比单链表的优势是?

第3题:在p后插入s时,原后继节点需要执行的操作是?

📝本课知识点

  • ✓双向链表=prev+next双指针
  • ✓前后皆可走,删除不用找前驱
  • ✓灵活的代价是更多内存
第11课完成!继续探索下一课吧 🚀