【问题标题】:Why does this code not return a reverse Linked List为什么此代码不返回反向链接列表
【发布时间】:2021-02-09 12:41:04
【问题描述】:
Input = [1, 2, 3, 4, 5]

    def reverseList(self, head):
    prev = None
    while head:
        cur = head
        cur.next = prev
        head = head.next
        prev = cur

    return prev

我不明白为什么上面的结果返回

Output = [1]

cur是临时变量,不受头变量变化的影响(我是这么想的)

    def reverseList(self, head):
    prev = None
    while head:
        cur = head
        head = head.next
        cur.next = prev
        prev = cur

    return prev

返回正确的结果,我不明白为什么。它表明对head 的更改也会更改cur 变量,尽管它在 cur 设置为cur = head 之后发生了更改

【问题讨论】:

    标签: python linked-list


    【解决方案1】:

    这是您的示例链表:

    [1] -> [2] -> [3] -> [4] -> [5]

    最初head 指向[1]prev 指向None。现在让我们逐行执行您的第一个代码。您首先将cur 设置为head(例如,cur 现在指向[1]),这意味着从现在开始headcur 都指向[1]。现在,当您设置cur.next = prev 时,您实际上是在设置[1].next = None。因此,[1][2] 之间的链接已经断开,此时您将松开链接列表的所有其他部分(例如,[2] -> [3] -> [4] -> [5])。现在当您执行head = head.next 时,这意味着您正在执行[1] = [1].next,之前您设置了[1].next = None。在下一次运行中,while loop 将终止,因为头部变为None

    我强烈建议您使用笔和纸对第二个代码进行此类模拟,您将了解其中的区别。

    【讨论】:

    • 感谢您的详细解释!但是还有一件事让我很困扰。我通过设置cur.next = prev 得到head.next 也指向None。但是当我们先设置head = head.next,得到[2],为什么cur.next不是[1]
    • 我不明白“为什么cur.next 不是[1]?”是什么意思
    • 好吧,让我换个方式问:headcur 在开头是 [1]。下一个节点是[2],所以head.next = [2]。在这种状态下,当head = [2]cur = [1] 还是cur = [2]?如果还是[1],那为什么更改head不影响cur,而更改cur,尤其是cur.next=prev会影响head
    • (i) when head = [2] is cur = [1] or cur = [2]? 回答:cur = [1]。 (ii) If it is still [1], then why do changes to head not affect cur, but changing cur or especially cur.next=prev affect head? Ans: head 和 cur 通过 [1] 相互关联。当您设置cur.next = None 时,您实际上是在设置[1].next = None。此时,head也指向[1],对吧?那么当你调用head = head.next时,你实际上是在做head = [1].next,你知道[1].next已经被设置为None。在您正确理解这里发生的事情之前,请随时提出问题。
    • 感谢您花时间和我在一起 :D 所以基本上,设置cur = head 意味着两者都在同一个链表上,它们就像指针一样。当设置cur = cur.nexthead = head.next 时,我们正在移动这些指针,彼此独立。但是当我们设置cur.next = somethinghead.next = something 时,我们正在更改链表,因为我们更改了链表上curhead 的下一个元素,因此curhead 现在都是指向一个不同的“新”链表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多