反向链表:为什么 head = head.next 的位置很重要?
Reversed Linked List: Why does the position of head = head.next matter?
谁能解释一下为什么这条线 head=head.next
的位置必须在 curr=head
之后,而不是再往下?最初,我将 head=head.next
放在 while 循环的最后一行,但只得到最后一个节点。例如。如果输入是 [1,2,3]
,我将使用第二个代码块得到 [1]
,使用第一个代码块得到 [3,2,1]
。
正确:
def reverseListIterative(head: ListNode):
prev = None
while head:
curr = head
head = head.next
curr.next = prev
prev = curr
return prev
错误:
def reverseListIterative(head: ListNode):
prev = None
while head:
curr = head
curr.next = prev
prev = curr
head = head.next
return prev
您可以通过代码流跟踪每个变量的内容来解决这个问题(您甚至不需要运行):
假设我们从列表 1 -> 2 -> 3 开始
prev curr head head.next curr.next
---- ---- ---- --------- ---------
prev = None None - 1 2 -
while head:
curr = head None 1 1 2 2
curr.next = prev None 1 1 None None ***
prev = curr 1 1 1 None None
head = head.next 1 1 None - None
return prev
当您将 prev (None) 分配给 curr.next 时,您会失去来自 head.next 的连接,因为 head 也指向节点 #1。
谁能解释一下为什么这条线 head=head.next
的位置必须在 curr=head
之后,而不是再往下?最初,我将 head=head.next
放在 while 循环的最后一行,但只得到最后一个节点。例如。如果输入是 [1,2,3]
,我将使用第二个代码块得到 [1]
,使用第一个代码块得到 [3,2,1]
。
正确:
def reverseListIterative(head: ListNode):
prev = None
while head:
curr = head
head = head.next
curr.next = prev
prev = curr
return prev
错误:
def reverseListIterative(head: ListNode):
prev = None
while head:
curr = head
curr.next = prev
prev = curr
head = head.next
return prev
您可以通过代码流跟踪每个变量的内容来解决这个问题(您甚至不需要运行):
假设我们从列表 1 -> 2 -> 3 开始
prev curr head head.next curr.next
---- ---- ---- --------- ---------
prev = None None - 1 2 -
while head:
curr = head None 1 1 2 2
curr.next = prev None 1 1 None None ***
prev = curr 1 1 1 None None
head = head.next 1 1 None - None
return prev
当您将 prev (None) 分配给 curr.next 时,您会失去来自 head.next 的连接,因为 head 也指向节点 #1。