Python 反向链接列表(参考下一个节点)

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

我正在研究一个问题,它要求反转链接列表:

例如:

对于链表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 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
赋值没有意义-它是一个局部变量。