指针交接瞬间
目录
一句话
a->next = b->next只是"复制指针"(让a->next指向b->next指向的同一个节点);“插入"是两步的组合:先让新节点接住后面的链,再让前面的节点改指新节点。两步之间,两个指针会短暂指向同一个节点——这就是交接瞬间。
1 赋值语义:先读清楚一行代码
head->next = dummy->next 的意思是:把 dummy->next 的值(一个地址)赋给 head->next。
- 右边是"源”,左边是"目标"。
- 执行完这一行,
head->next和dummy->next指向同一个节点。 - 单看这一行,它只是复制指针,不是插入。
2 为什么"插入"必须是两步
假设当前状态:
| |
第 1 步 head->next = dummy->next(先接住后面的链):
| |
第 2 步 dummy->next = head(前面的节点改指新节点):
| |
交接瞬间 第 1 步执行后的一瞬间,两个指针指向同一个节点,这是刻意的——新节点先"抓住"后面的链,前面的节点才敢"松手"。不是 bug。
3 顺序为什么不能反
如果先做 prev->next = newNode,再做 newNode->next = prev->next:
| |
所以顺序固定:先接后面,再改前面。
4 通用套路
4.1 标准插入两步
| |
4.2 反转链表头插法(Q206)
| |
4.3 两两交换(Q24 的 swapTwo)
| |
4.4 一条总规则
改指针之前,先保证后面的链不会丢:
- 要读的旧指针,先存下来(
next = cur->next); - 新节点要接的链,先接上(
head->next = dummy->next)。
5 记忆
- 单行赋值 = 复制指针(两个指针指向同一个节点)。
- 两步组合 = 插入(先接住,再松手)。
- 口诀:先接后面,再改前面;改指针前,先防断链。
6 相关笔记
- Q206 反转链表(头插法)
- Q24 两两交换链表中的节点(swapTwo)
- 空指针与虚拟头节点(dummy 是什么、为什么需要真实节点)
7 自测
- 能说出
head->next = dummy->next执行后,哪两个指针指向同一个节点 - 能把"标准插入两步"默写出来
- 能解释为什么顺序不能反(会成环)
- 能指出反转头插法和 swapTwo 里的"先接后面,再改前面"
- 能说出一条总规则:改指针前先防断链