双向链表插入节点,常用方法分析与口诀速记
常用口诀是:
“先连新,再断旧”
具体来说,插入节点 q 到节点 p 前面,一共四步——口诀每两字对应一步操作,帮助记忆指针修改顺序:
| 步骤 | 口诀 | 操作代码 | 
|---|---|---|
| ① | 先连新 | q->next = p; | 
| ② | q->prev = p->prev; | 
|
| ③ | 再断旧 | p->prev->next = q;(原前驱改指) | 
| ④ | p->prev = q;(p 的前驱改为 q) | 
完整代码如下(假设双向链表无头结点且 p 不为空):
// 将节点 q 插入到 p 前面
q->next = p;
q->prev = p->prev;
p->prev->next = q; 
p->prev = q;
如果是有头结点(dummy head)的链表,要注意 p 前驱可能是头指针 head,根据情况判断是否还需要特判。
✅口诀“先连新,再断旧”非常好用,类似后插用的“先断旧,再连新”。
这两种写法其实都是等价的,只是指针赋值的顺序不同:
✅ 写法 A(你的代码顺序):
p->llink->rlink = q;
q->rlink = p;
q->llink = p->llink;
p->llink = q;
✅ 写法 B(常见参考顺序):
q->next = p;
q->prev = p->prev;
p->prev->next = q;
p->prev = q;
✏️ 为什么都对?
因为双向链表插入一个节点,总共就是4根指针需要修改:
| 要修改的指针 | 含义 | 
|---|---|
| q→next | 新节点 q 的后继指向 p | 
| q→prev | 新节点 q 的前驱指向原来 p 的前驱 | 
| p→prev→next | 原来 p 的前驱的后继改为 q(断开旧,连上新) | 
| p→prev | p 的前驱改为 q | 
无论你用什么顺序,只要每一步修改时用到的指针还没有被改“掉”,那么结果就是正确的。
🔍 两种顺序的差别在什么?
| 顺序 | 特点 | 风险 | 
|---|---|---|
| 写法 A | 先改外层指针,再改 q | 要确保 p->llink 和 p 都有效 | 
| 写法 B | 先处理新结点 q 的指针,再断旧链 | 更安全、常见 | 
写法 B(先连新节点自身的指针,再改原链表)比较稳定安全,不依赖于链表原有结构不变,因此常用于教材和模板。
而写法 A 也是完全正确的,只要你确保链表结构在操作过程中没有变化,就不会出现“悬空指针”。
✅ 小结口诀记忆:
- 
写法 A 风格口诀:
👉 “先指旧,再改新” - 
写法 B 风格口诀(推荐):
👉 “先连新,再断旧” 
                    
                
                
            
        
浙公网安备 33010602011771号