链表反转本质是修改next指针而非交换val值,因链表结构意义在于引用关系;三指针法需用next_temp暂存后续节点以防丢失;递归中head.next.next=head实现尾节点回指,且须置head.next=None防环。

为什么链表反转不是“交换值”,而是改指针
单向链表反转的本质,是让每个节点的 next 指针从指向后一个节点,改为指向前一个节点。很多人一开始写成“交换 val”,那是把链表当成数组用了——链表的结构意义就在 next 引用上,改值不改引用,链表形态根本没变。
关键在于:Python 中变量名是引用,node.next 是一个可修改的属性,不是只读副本。你改的是堆中那个节点对象的字段,所有持有该节点引用的地方都会看到变化。
三指针法里 prev、curr、next_temp 各自不能少
常见错误是漏存 curr.next,导致一执行 curr.next = prev 就丢掉后续链:
curr.next = prev # 此时原 curr.next 已不可达,除非提前保存
必须用临时变量先抓下下一个节点:
立即学习“Python免费学习笔记(深入)”;
-
prev:已处理完的部分的新头(初始为None) -
curr:当前正在翻转的节点(初始为原头) -
next_temp:唯一能保住后续链的“救命索引”,每次循环开头就存curr.next
顺序不能乱:先存 next_temp → 再改 curr.next → 最后更新 prev 和 curr。
递归反转的返回值到底在传什么
递归写法里,reverseList(head.next) 返回的是新链表的头(也就是原链表的尾),但很多人卡在“为什么最后要 head.next.next = head”:
因为递归到底层时,head 是倒数第二个节点,它的 next 指向最后一个节点 tail;而 reverseList(head.next) 已经把 tail 后面全翻好了,现在只需让 tail.next 指回来:head.next.next = head 就是 tail.next = head。
别忘了断开旧连接:head.next = None,否则会成环。
测试时容易忽略的边界和副作用
反转操作会直接修改原链表结构,没有拷贝——这是考察“引用理解”的核心落点。测试时务必注意:
- 输入
None或单节点,应原样返回,不抛错 - 反转后原
head的next必须为None,否则尾部没截断 - 如果测试代码里还拿着老的
head变量去遍历,它现在是尾节点,会立刻终止遍历 - 多个变量引用同一节点时(比如
a = head; b = head.next),反转后b.next不再是a,而是可能变成None或别的节点
最易被忽略的,是以为“函数内重新赋值变量名”会影响外部引用——其实不会;真正影响外部的,只有对对象属性(如 node.next)的修改。


















