反转链表:head=head.next的放置位置为什么会影响执行结果?
链表反转代码行顺序问题解释
核心问题是Python中对象赋值是引用传递,curr = head 是让curr和head指向同一个链表节点对象,修改其中一个的属性会同步影响另一个。
你给出的两段代码差异仅为head = head.next的位置,我们以输入链表[1→2→3→None]为例拆解执行过程就能清晰看出问题:
错误代码执行逻辑
def reverseListIterative(head: ListNode): prev = None while head: curr = head curr.next = prev prev = curr head = head.next return prev
初始状态:prev = None,head指向值为1的节点
- 第一次进入while循环:
curr = head:curr和head同时指向1节点curr.next = prev:将1节点的next属性改为None,此时head指向的1节点的next已经同步变为None,原链表1→2的指向被彻底修改prev = curr:prev更新为指向1节点head = head.next:当前1节点的next已经是None,因此head直接赋值为None,循环终止
- 最终返回prev,仅得到值为1的单个节点,和你遇到的输出一致。
正确代码执行逻辑
def reverseListIterative(head: ListNode): prev = None while head: curr = head head = head.next curr.next = prev prev = curr return prev
初始状态:prev = None,head指向值为1的节点
- 第一次进入while循环:
curr = head:curr和head同时指向1节点head = head.next:先将head移动到原链表的下一个节点(值为2的节点),此时head和curr指向不同对象,后续修改curr属性不会影响headcurr.next = prev:将1节点的next改为None,不影响指向2节点的headprev = curr:prev更新为指向1节点
- 第二次进入while循环(head指向2节点):
- 重复逻辑,head先移动到3节点,再将2节点的next指向1节点,prev更新为指向2节点
- 第三次进入while循环(head指向3节点):
- 重复逻辑,head先移动到None,再将3节点的next指向2节点,prev更新为指向3节点
- 循环终止,返回prev得到反转完成的链表
[3→2→1→None],结果正确。
总结
单链表反转的节点操作必须遵循「先保存原链表下一个节点的位置,再修改当前节点的next指向」的顺序,你把head = head.next放在修改curr.next之后,就会丢失原链表后续节点的引用,导致遍历提前终止。
内容的提问来源于stack exchange,提问作者IceTea
相关产品推荐
相关产品推荐

