创建LinkedLis时出错

2024-06-10 15:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,对于不同语言的数据结构实践,我决定用python创建一个链表。你知道吗

到目前为止,这是我的代码,它还远未完成,但我遇到了这个错误,我似乎无法向自己指出它的来源:

class LinkedNode:
    def __init__(self, value):
        self.value = value
        self.nextNode = None

class LinkedList:
    def __init__(self):
        self.headNode = None

    def isEmpty(self):
        return self.headNode == None

    def addToHead(self, value):
        head = LinkedNode(value)

    def removeFromHead(self):
        head = self.headNode
        self.headNode = self.headNode.nextNode
        return head

    def addToTail(self, value):
        if self.headNode == None:
            self.addToHead(value)
        else:
            tmp = self.headNode
            while tmp.nextNode != None:
                tmp = tmp.nextNode
            tmp.nextNode = LinkedNode(value)

    def empty(self):
        self.headNode = None

    def contains(self, value):
        tmp = self.headNode
        while tmp.nextNode != None:
            if tmp.value == value:
                return true
            tmp = tmp.nextNode
        return False

    def toString(self):
        tmp = self.headNode
        buffer = '['
        while tmp.nextNode != None:
            buffer = buffer + str(tmp.value) + ', '
            tmp = tmp.nextNode
        buffer = buffer + ']'

list = LinkedList()
list.addToHead(1)
list.addToHead(2)
list.addToTail(3)
list.toString()

错误如下:

Traceback (most recent call last):

File "path/linkedList.py", line 52, in list.toString()

File "path/linkedList.py", line 44, in toString

while tmp.nextNode != None:

AttributeError: 'NoneType' object has no attribute 'nextNode' [Finished in 0.138s]


Tags: selfnonereturnvaluedefbufferheadtmp
2条回答

你的addToHead方法没有副作用。可能你是说

def addToHead(self, value): 
    head = LinkedNode(value)
    head.nextNode = self.headNode
    self.headNode = head

此外,toString将因空列表而崩溃。你知道吗

  1. 首先,回答你的问题,这就是为什么你会出错:

您正在执行head = LinkedNode(value),希望LinkedListhead被覆盖。但实际上,您创建了一个名为head的局部变量,并将其赋值为LinkedNode(value)。因此,head总是None。显然你不能做None.nextNode(因为它不是一个对象)。你知道吗

解决方案:您实际需要的是self.head = LinkedNode(value)self是对您正在使用的对象的引用。你知道吗

  1. 其次,你的代码有几处错误。例如:

a.只需将head设置为新节点,就失去了对先前存在的节点的引用。你知道吗

解决方案:您需要的是:

def addToHead(self, value):
    tmp = LinkedNode(value)
    tmp.nextNode = self.headNode
    self.headNode = tmp

在其他编程语言中,toString是将对象表示为字符串的一种流行方式,但是pythonic的方法是重写对象的__str__()__repr__()方法。你知道吗

解决方案(我坚持使用您的格式,尽管它可能需要一些更改;):

def __repr__(self):
    tmp = self.headNode
    buffer = []
    while tmp is not None:
        buffer.append(tmp.value)
        tmp = tmp.nextNode
    return "[" + ", ".join(map(str, buffer)) + "]"

c.toString方法有几个错误(headNode没有打印,将失败headNodeNone等),但我不会尝试修复它们,因为我们有上面的解决方案。你知道吗

相关问题 更多 >