prev 必须初始化为 none,因为反转后首节点需指向空以正确截断链表;若误设为 head 或 listnode(0),会导致循环引用、节点丢失或假头插入。

为什么 prev 必须初始化为 None
链表反转本质是把每个节点的 next 指针从指向后一个,改为指向前一个。第一个节点反转后应该指向空——也就是新链表的尾部。如果把 prev 初始化成 head 或其他值,会导致头节点循环引用或丢失结尾,运行时可能不报错但结果错乱(比如变成环、丢节点、或只反转前两个)。
-
prev = None是唯一能保证反转后末尾正确截断的方式 - Python 中
None和 C 的NULL语义一致,不是“未定义”,而是明确的空引用 - 若误写成
prev = ListNode(0),会凭空多出一个假头节点,原链表长度+1且值错乱
三步交换顺序不能调换:为什么必须先存 next_node
反转核心是原子性地更新三个引用:current.next、prev、current。但 current.next 一改,原始后继就丢了——所以第一步必须用临时变量存下来。常见错误是先移动 current 或先改 prev,导致后续访问 current.next 报 AttributeError: 'NoneType' object has no attribute 'next'。
- 正确顺序:
next_node = current.next→current.next = prev→prev, current = current, next_node - 如果把第二步和第三步对调,
current已经变成next_node,再执行current.next = prev就是在操作新节点,逻辑全崩 - Python 的多重赋值
a, b = b, a在这里是安全的,但不能替换成两行独立赋值
递归解法里 return new_head 返回的是什么
递归反转的终止条件是 head is None or head.next is None,此时返回 head——它恰好是原链表的最后一个节点,也就是反转后的新头节点。很多人卡在“为什么不是返回 prev”,因为递归中根本没有 prev 变量;整个过程靠回溯时逐层修正 next 指针,最终只有最深层的 head 是稳定不变的“新头”。
- 递归版本不显式维护
prev,靠函数调用栈隐式保存“前驱”语义 - 中间层返回的
new_head始终是同一个节点(原尾),所有层都把它传上去 - 性能上,递归有栈空间开销,链表过长(>1000 节点)可能触发
RecursionError,而迭代版无此问题
测试时容易漏掉的边界 case
只用 [1,2,3,4,5] 测是不够的。真实调试中,多数 bug 出现在边界:空链表、单节点、双节点、含 None 值节点(非空但 val 是 None)。
立即学习“Python免费学习笔记(深入)”;
-
reverseList(None)必须返回None,否则下游判空逻辑崩溃 -
reverseList(ListNode(1))必须返回同一对象(id不变),不能新建节点 - 双节点如
1→2→None反转后要是2→1→None,常见错误是变成2→1→2→1…(环) - 别依赖
print(head)看结果——要手动遍历检查next链是否断裂或成环
None 输入、单节点、指针重连时机这三个点亲手敲一遍,错一次就记住了。










