【问题标题】:Reversed Linked List: Why does the position of head = head.next matter?反向链表:为什么 head = head.next 的位置很重要?
【发布时间】:2021-11-15 13:43:55
【问题描述】:

谁能解释为什么这条线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

【问题讨论】:

  • 分配给head时,currhead是相同的。因此赋值curr.next = prev 改变了原始 head.next,即赋值head = head.next 中使用的那个。很明显,在分配给head 之前执行该分配会改变它。
  • 请注意,此时curr is head。所以curr 上的任何突变(如curr.next = prev)也会影响head,如果你没有先重新分配它。
  • 有了这样的东西,它有助于绘制一个图表来显示事物指向的内容。这根本不是语言问题,实际上只是通过仔细分析来推理出某事的练习。
  • @TomKarzes 和 user2390182 谢谢!了解现在发生了什么

标签: python linked-list


【解决方案1】:

您可以通过代码流跟踪每个变量的内容来解决这个问题(您甚至不需要运行它):

假设我们从列表 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多