Python链表反转函数问题求助:为何仅返回单个节点而非完整链表?
链表反转函数的问题排查与修复
问题重现
需求:定义一个函数,输入链表头节点
ListNode,反转该链表并返回反转后链表的头节点。
示例:输入1->2->3->4->5->NULL,输出5->4->3->2->1->NULL
当前代码运行后仅返回单个节点,无法输出完整反转链表。
用户提供的原代码:
class ListNode(object): def __init__(self, val: int): self.val: int = val self.next: Optional[ListNode] = None class Solution(object): def reverseList(self, head): if not head: return None l = [] while head: l.append(head.val) head = head.next l = l[::-1] hn = ListNode(l[0]) for i in range(1, len(l)): hn.next = ListNode(l[i]) nnext = hn.next hn = nnext return hn
问题分析
核心bug出在链表重建的循环逻辑中:
- 初始化
hn时,它是反转后链表的头节点(对应示例中的5),但每次循环都会把hn移动到新创建的子节点上(依次变成4、3、2、1)。 - 循环结束后,
hn指向的是反转链表的最后一个节点(值为1),而这个节点的next为None,所以返回的只是单个节点,丢失了整个链表的引用链。
修复后的代码
解决思路是保留反转链表的头节点引用,用一个临时指针来遍历构建后续节点:
class ListNode(object): def __init__(self, val: int): self.val: int = val self.next: Optional[ListNode] = None class Solution(object): def reverseList(self, head): if not head: return None l = [] while head: l.append(head.val) head = head.next l = l[::-1] # 固定保存反转链表的头节点 new_head = ListNode(l[0]) # 用current指针遍历构建后续节点 current = new_head for i in range(1, len(l)): current.next = ListNode(l[i]) current = current.next return new_head
更高效的原地反转方案
上述方法需要额外数组存储节点值,空间复杂度为O(n)。推荐使用原地反转法,无需额外空间,时间复杂度仍为O(n):
class Solution(object): def reverseList(self, head): prev = None current = head while current: # 提前保存下一个节点,避免反转后丢失引用 next_node = current.next # 反转当前节点的指向 current.next = prev # 移动指针,处理下一个节点 prev = current current = next_node # 循环结束后,prev就是反转后的头节点 return prev
内容的提问来源于stack exchange,提问作者user22007579
相关产品推荐
相关产品推荐

