创建LinkedList时出错

时间:2016-04-10 14:32:16

标签: python linked-list

因此,对于不同语言的数据结构实践,我决定在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()

这是错误:

  

追踪(最近一次呼叫最后一次):

     

文件"路径/ linkedList.py",第52行,in       list.toString()

     

文件"路径/ linkedList.py",第44行,在toString中

while tmp.nextNode != None:
     

AttributeError:' NoneType'对象没有属性' nextNode'   [以0.138秒完成]

1 个答案:

答案 0 :(得分:1)

  1. 首先,要回答您的问题,这正是您收到错误的原因:
  2. 您正在head = LinkedNode(value),希望覆盖LinkedList' head。但相反,您会创建一个名为head的局部变量,并为其赋值LinkedNode(value)。因此,head始终为None。你显然不能None.nextNode(因为它不是一个对象)。

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

    1. 其次,您的代码有几个问题。例如:
    2. 一个。只需将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)) + "]"
      

      ℃。 toString方法存在一些问题(headNode未打印,headNode未成为None等等,但我不会尝试并修复它们,因为我们有上述解决方案。