单链表反转迭代解法:为何需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
相关产品推荐
相关产品推荐

