【问题标题】:I tried solving reverse linkedlist on my own way. please spot the problem reversing the linkedlist我尝试以自己的方式解决反向链表。请发现反转链表的问题
【发布时间】:2020-06-11 09:09:35
【问题描述】:

大家好,你能告诉我为什么这段代码不能用于反转链表我尝试了自己的方法来解决,但不明白我做错了什么

 def reverselist(self):
    temp=self.start
    cur=None
    prev=None
    nxt=None
    while(temp!=None):
        nxt=temp.next
        cur=temp
        cur.next=prev
        prev=cur
        temp=temp.next

【问题讨论】:

  • prev=None ... cur=temp ... cur.next=prev ... temp=temp.next,现在 temp 为 None 并且它离开了 while。最后你还必须调整 self.start 指针
  • 嗨,但我将 temp 分配给了 cur,所以 temp 值不会被更改,所以为什么除非列表位于末尾,否则它不会是 none。

标签: algorithm data-structures linked-list singly-linked-list doubly-linked-list


【解决方案1】:

看看这些作业:

    cur=temp
    cur.next=prev
    prev=cur
    temp=temp.next

真正改变列表的是cur.next=prev。在那里,您使 next 指针向后指向。但是那个改变之后,你做temp=temp.next。所以你在这里取 modified .next 值。

如果这不能澄清,那么请意识到temp == cur(第一个分配),还有cur.next == temp.next。如果您为cur.next 分配一个新值,那么temp.next 将是那个新值。

解决方案是在更改next 指针之前执行temp=temp.next

    cur=temp
    temp=temp.next
    cur.next=prev
    prev=cur

或者,我觉得更清楚一点,但实际上是一样的:

    cur=temp
    temp=cur.next
    cur.next=prev
    prev=cur

在这里您可以清楚地看到模式:作业右侧的内容将在下一个作业中变为左侧。这清楚地表明您首先读取变量或属性的当前值,然后写入一个新值。

注意:你从来没有阅读nxt,所以你不需要那个变量。

一次性全部赋值

在 Python 中,您可以一次性进行多个赋值,这样可以为您节省一个变量 (prev),因为右侧的 所有 表达式在任何赋值发生之前都会被计算:

    temp.next, cur, temp = cur, temp, temp.next

【讨论】:

  • 您好,非常感谢您,我可以知道您的个人 insta id 聊天吗
  • 我不聊天。对不起。
  • 好吧,我只是想征求你的意见。如果那不是你继续感谢您的解释,尽管一切都很清楚。
【解决方案2】:

在下面试试这个:

def reverselist(self):
    temp=self.start
    cur=None
    prev=None
    nxt=None
    while(temp!=None):
        nxt=temp.next
        temp.next = prev
        prev = temp
        temp = nxt
    self.start = prev

【讨论】:

  • 你需要将prev节点指向while循环外的末尾
  • 是的,你是对的,你能解释清楚为什么因为我不明白吗??
  • 那是因为在你执行while循环之后,整个列表被反转了,但你的列表没有任何头部,所以不会有任何起点,你将无法打印它。
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2012-06-25
相关资源
最近更新 更多