双向链表插入节点,常用方法分析与口诀速记

常用口诀是:

“先连新,再断旧”

具体来说,插入节点 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 风格口诀(推荐)
    👉 “先连新,再断旧”


posted @ 2025-08-05 16:22  kkman2000  阅读(57)  评论(0)    收藏  举报