【问题标题】:Reverse Singly Linked List (Don't Know Why My Code is Wrong)反向单链表(不知道为什么我的代码是错误的)
【发布时间】:2019-12-06 21:29:00
【问题描述】:

作为一个链表数据结构的学习者,我正在练习 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

对我来说,这两个语句切换与否没有区别,为什么它们不一样?

【问题讨论】:

    标签: python linked-list


    【解决方案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 设置为现在截断列表的头部。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        temp = head 使temp 引用与 head 相同的对象

        考虑到这一点,下一行temp.next = prev 实际上与head.next = prev 相同,因为它们再次在您的代码中引用同一个对象

        修复解决了这个问题,因为在您影响 head 所指的对象之前,您正在将 head 所指的对象重新分配给另一个对象 - 特别是链接列表中的下一个对象。

        【讨论】:

          猜你喜欢
          • 2017-07-08
          • 1970-01-01
          • 1970-01-01
          • 2012-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          相关资源
          最近更新 更多