You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

反转链表: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的节点

  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,循环终止
  2. 最终返回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的节点

  1. 第一次进入while循环:
    • curr = head:curr和head同时指向1节点
    • head = head.next:先将head移动到原链表的下一个节点(值为2的节点),此时head和curr指向不同对象,后续修改curr属性不会影响head
    • curr.next = prev:将1节点的next改为None,不影响指向2节点的head
    • prev = curr:prev更新为指向1节点
  2. 第二次进入while循环(head指向2节点):
    • 重复逻辑,head先移动到3节点,再将2节点的next指向1节点,prev更新为指向2节点
  3. 第三次进入while循环(head指向3节点):
    • 重复逻辑,head先移动到None,再将3节点的next指向2节点,prev更新为指向3节点
  4. 循环终止,返回prev得到反转完成的链表[3→2→1→None],结果正确。

总结

单链表反转的节点操作必须遵循「先保存原链表下一个节点的位置,再修改当前节点的next指向」的顺序,你把head = head.next放在修改curr.next之后,就会丢失原链表后续节点的引用,导致遍历提前终止。

内容的提问来源于stack exchange,提问作者IceTea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:07