反向单链表(不知道为什么我的代码错误)

时间:2019-12-06 21:29:00

标签: python linked-list

作为链表数据结构的学习者,我正在练习Leetcode问题“反向链表”,我有自己的解决方案,但不知道为什么错了,任何人都可以分享一些指导吗?真的很感激!

Leetcode问题:

反向单链列表。

示例:

输入:1-> 2-> 3-> 4-> 5-> NULL

输出:5-> 4-> 3-> 2-> 1-> NULL

我的代码:

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        prev = None
        while head:
            temp = head
            temp.next = prev
            head = head.next
            prev = temp
        return prev

但是,上述解决方案是错误的,但是可以通过如下方式在“ temp.next = prev”和“ head = head.next”之间切换位置来纠正:

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        prev = None
        while head:
            temp = head
            head = head.next
            temp.next = prev
            prev = temp
        return prev

对我来说,切换两个语句之间没有什么区别,它们为什么不同?

3 个答案:

答案 0 :(得分:1)

以下是循环开始之前的参考:

prev --> None
head --> [something| *-]-> [something| *-]-> ...

temp = head之后:

prev --> None
head --> [something| *-]-> [something| *-]-> ...
         ^
         |
temp ----+

temp.next = prev之后:

prev --> None
head --> [something| *-]-> None    .... -> [something| *-]-> ...
         ^
         |
temp ----+

您不再对列表后面的部分有任何引用。 head = head.next只需将head设置为None。然后将prev设置为现在被截断的列表的开头。

答案 1 :(得分:1)

您必须记住,在表面之下,我们也在处理指针及其在内存中指向的空间。

对于第一个解决方案,head无法将自身分配给head.next,因为temp.next现在指向None。通过将temp.next分配给null,您已经有效地将head.next分配给了null。

第二个解决方案通过首先将head-to-head.next重新分配来解决此问题。这并不意味着温度会随头部一起移动。 Head现在指向head.next,而temp指向head的前一个节点(在转到head.next之前)。

答案 2 :(得分:1)

temp = head使temp 指向与 head

相同的对象

请牢记这一点,下一行temp.next = prevhead.next = prev实际上是相同的,因为它们再次 指的是同一对象 在您的代码中。

在影响head所引用的对象之前,此修复程序已解决了此问题,您正在将head所引用的内容完全分配给另一个对象-特别是链接列表中的下一个对象。