Python 创建LinkedList时出错

Python 创建LinkedList时出错,python,linked-list,Python,Linked List,因此,对于不同语言的数据结构实践,我决定用python创建一个链表 现在这里是我的代码,到目前为止,它还远未完成,但我遇到了这个错误,我似乎无法向自己指出它的来源: class LinkedNode: def __init__(self, value): self.value = value self.nextNode = None class LinkedList: def __init__(self): self.headNo

因此,对于不同语言的数据结构实践,我决定用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()
以下是错误:

回溯(最近一次呼叫最后一次):

文件“path/linkedList.py”,第52行,在 list.toString()

文件“path/linkedList.py”,第44行,在toString中

while tmp.nextNode != None:
AttributeError:“非类型”对象没有属性“nextNode” [在0.138s内完成]


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

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

此外,toString将因空列表而崩溃。

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

def addToHead(self, value): 
    head = LinkedNode(value)
    head.nextNode = self.headNode
    self.headNode = head
此外,toString将因空列表而崩溃

  • 首先,为了回答您的问题,这正是您出错的原因:
  • 您正在执行
    head=LinkedNode(value)
    ,希望
    LinkedList
    head
    被覆盖。但是,实际情况是创建一个名为
    head
    的局部变量,并将
    LinkedNode(value)
    的值赋给它。因此,
    head
    总是
    None
    。显然,您不能执行
    None.nextNode
    (因为它不是对象)

    解决方案:您实际需要的是
    self.head=LinkedNode(value)
    <代码>自我是对正在使用的对象的引用

  • 其次,您的代码有几处错误。例如:
  • a。通过简单地将
    头设置为新节点,您将失去对以前现有节点的引用

    解决方案:您需要的是:

    def addToHead(self, value):
        tmp = LinkedNode(value)
        tmp.nextNode = self.headNode
        self.headNode = tmp
    
    b<在其他编程语言中,code>toString
    是将对象表示为字符串的一种流行方式,但python的方法是重写对象的
    \uu str\uuu()
    \uu repr\uu()
    方法

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

    c。
    toString
    方法有几处错误(
    headNode
    未打印,将失败
    headNode
    None
    等),但我不会尝试修复它们,因为我们有上面的解决方案

  • 首先,为了回答您的问题,这正是您出错的原因:
  • 您正在执行
    head=LinkedNode(value)
    ,希望
    LinkedList
    head
    被覆盖。但是,实际情况是创建一个名为
    head
    的局部变量,并将
    LinkedNode(value)
    的值赋给它。因此,
    head
    总是
    None
    。显然,您不能执行
    None.nextNode
    (因为它不是对象)

    解决方案:您实际需要的是
    self.head=LinkedNode(value)
    <代码>自我是对正在使用的对象的引用

  • 其次,您的代码有几处错误。例如:
  • a。通过简单地将
    头设置为新节点,您将失去对以前现有节点的引用

    解决方案:您需要的是:

    def addToHead(self, value):
        tmp = LinkedNode(value)
        tmp.nextNode = self.headNode
        self.headNode = tmp
    
    b<在其他编程语言中,code>toString
    是将对象表示为字符串的一种流行方式,但python的方法是重写对象的
    \uu str\uuu()
    \uu repr\uu()
    方法

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


    c。
    toString
    方法有几处错误(
    headNode
    未打印,将失败
    headNode
    None
    等),但我不会尝试修复它们,因为我们有上面的解决方案。

    我认为这也有问题。head甚至可能不存在,因此nextNode无论如何都将为空。是的,如果headNode为None,则表示您正在插入一个空列表,而head.nextNode应为None,因为插入后只有一个节点(即head),我认为这也存在问题。head甚至可能不存在,因此nextNode无论如何都将为空。是的,如果headNode为None,则意味着您正在插入一个空列表,head.nextNode应为None,因为插入后只有一个节点(即head)啊,我明白您所说的“pythonic”方式是什么意思了,我只想这样做
    print(repr(list))
    str
    ,如果我也选择使用它的话。做什么更好?人们会喜欢toString表示法以及同时使用pythonic表示法吗?通常建议不要有代码重复(既有
    \str\uu()
    又有
    toString
    )。此外,您甚至不必执行
    print(repr(list))
    。一个简单的
    print(list)
    将自动调用
    \u str\u()
    方法:)啊,好的,知道这个很好!那么,我将坚持使用
    \uu str\uuu()
    方法!啊,我明白你所说的“pythonic”做事方式是什么意思了,如果我也选择使用这种方式的话,我只会做
    print(repr(list))
    str
    。做什么更好?人们对toString表示法以及同时使用pythonic表示法感到满意吗?通常建议不要有代码重复(同时使用
    \uu str\uuu()
    toString
    )。另外,您甚至不必执行
    打印(repr(list))
    。一个简单的
    print(list)
    会自动调用
    \uu str\uuu()
    方法:)啊,好吧,知道这个很好!那么,我将坚持使用
    \uu str\uuu()
    方法!