我正在用以下代码反转一个单链表:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head:
return []
curr = head.next
prev = head
while curr:
curr.next = prev
curr = curr.next
prev = prev.next
return curr
我犯了一个超时错误,但我似乎看不出这个问题。当我在纸上运行循环时,它似乎工作得很好,有什么想法导致了什么,我认为循环不会终止吗?感谢
有几个问题:
-
curr.next
在执行curr = curr.next
时已被修改。因此,不是在列表中向前,而是向后(因为此时curr.next
实际上等于prev
(。 -
head.next
从未被修改,但它应该变成None
。你实际上应该开始一步";较早的";使得curr
等于head
,并且prev
应该是None
。 -
return curr
总是返回None
,因为这是while
循环退出的条件。
这里有一个修复:
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
curr = head
prev = None
while curr:
nxt = curr.next # Remember what the next node is before losing the reference
curr.next = prev # Rewire.
prev = curr # Move the two references one step forward
curr = nxt # ... using the saved reference
return prev # Return what was the tail node, but now is the new head
所以我们在这里使用一个临时变量nxt
。您也可以使用元组赋值。。。那么就不需要显式的临时变量:
while curr:
curr.next, prev, curr = prev, curr, curr.next