Python 反向链接列表(参考下一个节点)
我正在研究一个问题,它要求反转链接列表: 例如: 对于链表1->2->3,反向链表为3->2->1 这是我的密码:Python 反向链接列表(参考下一个节点),python,linked-list,Python,Linked List,我正在研究一个问题,它要求反转链接列表: 例如: 对于链表1->2->3,反向链表为3->2->1 这是我的密码: """ Definition of ListNode class ListNode(object): def __init__(self, val, next=None): self.val = val self.next = next """ class Solution: """ @param head: The fi
"""
Definition of ListNode
class ListNode(object):
def __init__(self, val, next=None):
self.val = val
self.next = next
"""
class Solution:
"""
@param head: The first node of the linked list.
@return: You should return the head of the reversed linked list.
Reverse it in-place.
"""
def reverse(self, head):
# write your code here
prev = None
current = head
next = current.next
while(current is not None):
current.next = prev
prev = current
current = next
next = next.next
head = prev
return prev
提交后,我得到了错误。有谁能帮我指出这是错误的?
错误消息是“next=current.next AttributeError:'NoneType'对象没有属性'next'”。我尝试使用next引用当前节点旁边的节点
谢谢 您正在尝试访问
next。next
,但是next
可能是None
(您检查了当前的是否为None
,但没有检查next
是否为无下一个在循环的最后一次迭代中将确实为无None
)。
因此,您需要在循环内移动next=current.next
,并删除循环中的最后一行,如下所示:
def reverse(self, head):
# write your code here
prev = None
current = head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
return prev
您正在尝试访问next。next
,但是next
可能是None
(您检查了current
是否为None
,但没有检查next
是否为None
在循环的最后一次迭代中确实是None
)。
因此,您需要在循环内移动next=current.next
,并删除循环中的最后一行,如下所示:
def reverse(self, head):
# write your code here
prev = None
current = head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
return prev
问题发生在最后一个案例中。当“当前”等于列表中的最后一个节点时,可以转到“将下一个节点指定给下一个节点”。问题是此时next等于null,因此您所说的null等于null.null,这导致了您的错误。您可能应该将while循环条件更改为
while(next is not None):
并将“添加到后一节”更改为更新列表中的最后一个节点以指向上一个节点
current.next = prev
head = prev
return prev
问题发生在最后一个案例中。当“当前”等于列表中的最后一个节点时,可以转到“将下一个节点指定给下一个节点”。问题是此时next等于null,因此您所说的null等于null.null,这导致了您的错误。您可能应该将while循环条件更改为
while(next is not None):
并将“添加到后一节”更改为更新列表中的最后一个节点以指向上一个节点
current.next = prev
head = prev
return prev
请张贴完整的回溯副本-我想你需要检查,如果头部是没有之前做你的逻辑。如果没有头,你只需要返回它。总是考虑各种测试用例。例如,空列表,包含一个、两个……项的列表,等等@VitalieMaldur:no-请参阅Miriam Farber的答案,它避免了任何特殊情况。(链表代码的第一条规则:“无特殊情况”-您将错过一个。)请发布完整的回溯副本-我认为您需要在执行逻辑之前检查head是否为None。如果没有头,你只需要返回它。总是考虑各种测试用例。例如,空列表,包含一个、两个……项的列表,等等@VitalieMaldur:no-请参阅Miriam Farber的答案,它避免了任何特殊情况。(链表代码的第一条规则:“没有特殊情况”-你会错过一个。)现在明白了。谢谢米里亚姆!!这是正确的答案——请注意,没有特殊情况。一个诡辩的说法是,在你返回之前分配给head
是没有意义的-它是一个局部变量。现在知道了。谢谢米里亚姆!!这是正确的答案——请注意,没有特殊情况。一个诡辩的说法是,在返回之前为head
赋值没有意义-它是一个局部变量。