作为链表数据结构的学习者,我正在练习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
对我来说,切换两个语句之间没有什么区别,它们为什么不同?
答案 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 = prev
与head.next = prev
实际上是相同的,因为它们再次 指的是同一对象 在您的代码中。
在影响head
所引用的对象之前,此修复程序已解决了此问题,您正在将head
所引用的内容完全分配给另一个对象-特别是链接列表中的下一个对象。