Python 有序链表。while循环中的多个条件导致错误 类节点: 定义初始化(自身,数据): self.data=data self.link=None 类无序: 定义初始化(自): self.head=无 def添加(自身、数据): 新建=节点(数据) ptr=自身头部 如果self.head==无: self.head=新 其他: 温度=ptr 而ptr=无:#我想写“while ptr!=无或 #ptr.data

Python 有序链表。while循环中的多个条件导致错误 类节点: 定义初始化(自身,数据): self.data=data self.link=None 类无序: 定义初始化(自): self.head=无 def添加(自身、数据): 新建=节点(数据) ptr=自身头部 如果self.head==无: self.head=新 其他: 温度=ptr 而ptr=无:#我想写“while ptr!=无或 #ptr.data,python,data-structures,singly-linked-list,Python,Data Structures,Singly Linked List,发生这种情况的原因是因为表达式ptr!=None或ptr.data

发生这种情况的原因是因为表达式
ptr!=None或ptr.data
是如何计算的

首先,它将检查
ptr!=None
。如果它是None(即表达式的计算结果为False),那么它将移动到
的另一端,并计算
ptr.data
。因为我们已经知道它是None,它尝试访问
None
属性,然后崩溃

不幸的是,这意味着您想在
while
条件中使用的表达式是不可能的。
你需要使用一个不同的表达式,比如
while ptr!=None和ptr.data
都是有效的,因为如果
ptr
一直都是None,表达式就会短路,永远不会尝试计算
ptr.data

@Christian Dean,但是当我使用我的self.head指向的add函数插入3时新节点已创建,不再是任何节点。如果我错了,请更正我?您的正确。我犯了一个错误。您实际的问题是,您在
while
循环中使用了
。这意味着无论您的测试是否失败(
ptr!=None
),while语句的第二部分都将运行(
ptr.data
)。您需要改用
,因此只有在测试成功的情况下才能尝试从
ptr
访问
数据(例如,您知道
ptr
不是
None
)。作为旁注,当使用布尔值和非类型值进行测试时,请使用
is
is not
代替
=
!=
。请复制粘贴错误。
class Node:
def __init__(self,data):
    self.data=data
    self.link=None

class UnOrdered:
    def __init__(self):
        self.head=None

    def add(self,data):
        new=Node(data)
        ptr=self.head

        if self.head==None:
            self.head=new

        else:
            temp=ptr
            while ptr!=None:  #I want to write "while ptr!=None or 
                               #ptr.data<new.data"
                temp=ptr
                ptr=ptr.link
            p=temp.link
            temp.link=new
            new.link=p
    def show(self):
        if self.head==None:
            print("No nodes")
        else:
            q=self.head
            while q!=None:

                print(q.data, end=" ")
                q=q.link

ul=UnOrdered()
ul.add(3)
ul.add(5)
ul.add(4)
ul.add(11)
ul.add(10)
ul.add(5)
ul.show()