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

单链表反转迭代解法:为何需prev、curr、next?双变量解法为何报错?

链表反转问题的错误分析与解法解析

问题背景

经典链表入门问题:给定单链表的head节点,反转该链表并返回反转后的链表。示例:输入head = [1,2,3,4,5],输出[5,4,3,2,1]。

标准迭代解法

def reverseList(self, head):
    prev = None
    curr = head

    while curr:
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    
    return prev

你尝试的双变量写法

def reverseList(self, head):
    curr=head
    while curr.next:
        tmp=curr
        curr=curr.next
        curr.next=tmp
    
    return curr

你的代码运行错误原因

  • 链表环导致死循环:以输入[1,2,3,4,5]为例,第一次循环后,节点2的next指向节点1;第二次循环时,curr会跳转到节点1(因为节点2的next是1),接着节点1的next又被设为节点2,此时1和2形成互相指向的环。后续循环中,curr会在1和2之间来回跳转,curr.next永远不为空,循环无法终止,最终触发运行时超时或栈溢出错误。
  • 原头节点未置空:即使循环能意外结束,原链表的头节点(比如节点1)的next仍指向节点2,反转后的链表尾部会出现环,而非正确的尾节点(指向None)。

为什么迭代解法需要三个变量?

  • next变量:用于暂存当前节点curr的下一个节点。因为修改curr.next指向prev后,原curr.next的引用会丢失,没有这个变量就无法继续遍历链表剩余节点。
  • prev变量:记录当前节点的前序节点,作为反转后curr.next的指向目标,这是实现链表反转的核心逻辑——让每个节点反向指向它的前一个节点。
  • curr变量:作为遍历游标,负责逐个处理链表中的节点,是循环的核心遍历载体。

你的双变量写法没有正确保存后续遍历的节点,反而在循环中制造了链表环,这是导致错误的根本原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:54:20