'NoneType'对象在Python链表中没有属性'val'

问题描述 投票:0回答:3

我最近开始练习在Python中使用LinkedList,遇到了以下问题。两个代码看起来都在做同样的事情,但其中一个出现了错误,而另一个则没有。有人可以告诉我为什么会这样吗?:

ListNode
类定义为:

#Python Linked List
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

假设我们有这个链表:

node = ListNode{val: 2, next: ListNode{val: 4, next: ListNode{val: 3, next: None}}}

代码1

这可以正常运行并打印“2 4 3”:

while node:
    print(node.val) # access the values of the node by node.val
    node=node.next`

代码2:

这给了我一个错误,说“NoneType”对象没有属性“val”,同时仍然打印“2”

node = node.next
print(node.val)

我希望看到代码 2 打印“2”,但不会给我错误。

请注意,代码 1 和代码 2 是独立运行的

node = ListNode{val: 2, next: ListNode{val: 4, next: ListNode{val: 3, next: None}}}

事实上,代码 2 确实打印 2,它只是打印 2 并带有

Nonetype
错误,这是我想避免的。

python linked-list
3个回答
1
投票

while 循环完成后,您位于链接列表中的最后一个

node
。 因此
node.next
将根据您的定义指向
None

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

0
投票

根据您的代码,您已将属性“val”的默认值设置为0,“next”设置为None。如果假设您已经创建了一个实例,则 None 将被分配给该实例的“next”属性。如果要访问“下一个”属性,请创建另一个实例并将其分配给前一个实例的“下一个”属性

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
   
node1 = ListNode()
node2 = ListNode()

node1.next = node2
print(node1.next)

0
投票

尝试访问 val 属性或遍历 None 对象的 next 指针将导致 AttributeError 并导致代码失败。检查 None 有助于确保该函数处理所有可能的情况。

        if node:
            print(node.val)
© www.soinside.com 2019 - 2024. All rights reserved.