非类型错误:Python双链接列表

非类型错误:Python双链接列表,python,linked-list,nonetype,Python,Linked List,Nonetype,陷入了使用my functions产生的非类型错误的解决方案中,在下面的代码中将添加并附加到空的Double_list类对象。最好的避免方法 class Dbl_Node: def __init__(self, data): self.data = data self.next = None self.prev = None class Double_list: def __init__(self): # Creates in

陷入了使用my functions产生的非类型错误的解决方案中,在下面的代码中将添加并附加到空的Double_list类对象。最好的避免方法

class Dbl_Node:

    def __init__(self, data):
        self.data = data
        self.next = None
        self.prev = None

class Double_list:

    def __init__(self): # Creates initial list w/ head and tail as None
        self.head = None
        self.tail = None

    def add(self, item): # adds node to beginning/head of list
        temp = self.head
        self.head = Dbl_Node(item)
        temp.prev = self.head
        self.head.next = temp

    def append(self, item): # adds node to end/tail of list
        temp = self.tail
        self.tail = Dbl_Node(item)
        self.tail.prev = temp
        temp.next = self.tail

您正在将
head
tail
初始化为
None
,但在插入第一个
Dbl_节点时,尝试在其上设置
prev
next
成员

def add(self, item):
    temp = self.head # on the first call to "add", self.head is None
                     # (as set in __init__) so temp is now None

    self.head = Dbl_Node(item) # create a new node and assign it to self.head
                               # this is fine

    temp.prev = self.head # this says assign the new node in self.head to the "prev"
                          # member of temp, however temp is None so the temp.prev part
                          # throws the error
你应该检查一下这个箱子

def add(self, item): # adds node to beginning/head of list
    temp = self.head
    self.head = Dbl_Node(item)
    if temp is not None:
        temp.prev = self.head
另一种解决方案是从头部和尾部的“虚拟”节点开始:

def __init__(self):
    self.head = Dbl_Node(None)
    self.tail = Dbl_Node(None)
    self.head.next = self.tail
    self.tail.prev = self.head
然后在这些节点之间插入项目

def add(self, item):
    temp = self.head.next
    self.head.next = Dbl_Node(item)
    temp.prev = self.head.next
    self.head.next.next = temp
虽然我发现这会让事情变得有点复杂

def append(self, item): # adds node to end/tail of list
        temp = self.tail
        self.tail = Dbl_Node(item)
        self.tail.prev = temp
        temp.next = self.tail
这将始终引发
NoneType
异常,因为
self.tail
最初为
None
,然后分配一个引用 将它(
None
)添加到
temp
,并尝试为其分配一些内容
。不行


您可能需要首先为
self.tail

分配一个新的对象引用,如果您将错误消息添加到问题中,您会得到更好的答案。对不起,当然,这里是:
“在add temp.prev=self.head builtins.AttributeError中:'NoneType'对象没有属性“prev”
它指的是带有temp.prev=self.head的行感谢您的快速更新。您可以通过单击问题标签下的
edit
按钮来编辑问题以添加其他信息。这是向问题添加信息的首选方法,因为在评论线程中有时会丢失一些信息。我的想法是,它会从“无”变为self.head中的任何内容。有什么好的理由不只是将
temp.prev
重新分配给新变量而不是错误?不是
temp.prev
None
,而是
temp
本身。当您尝试分配给
temp.prev
时,Python会在
temp
对象中查找名为
prev
的成员,即
None
,因此出现异常。我将用注释对上面的代码进行注释,以便更好地说明。哦,没错,因为temp并不是指整个节点实例,而是指self.head。我想我把temp作为一个完整的节点。谢谢你的解释!