2016-09-21 90 views
0

我是一名初学者,我开始学习python编程,并且遇到一个错误。我得到一个错误类型链接列表类型错误

class Node: 

    def __init__(self): 
     self.data = None 
     self.next = Node 

    def setData(self,data) 
     self.data = data 

    def getData(self): 
     return self.data 

    def setNext(self,next): 
     self.next = next 

    def getNext(self): 
     return self.next 

    def hasNext(self): 
     return self.next!=None 


class LinkedList(object): 

    def __init__(self): 
     self.length = 0 
     self.head = None 

    def listLength(self): 
     currentNode = self.head 
     length = 0 

     while currentNode.hasNext: 
      length = length + 1 
      currentNode = currentNode.getNext() 
     return length 

""" 
Methods to Insert nodes in a Linked List: 
# insertNode: Use this method to simply insert a node to the Linked List 
# insertHead: Use this method to insert a node at the head of the Linked List 
# insertTail: Use this method to insert a node at the tail of the Linked List 
# insertAtPosition: Use this method to insert a node at a particular position of the Linked List 
""" 

    def insertNode(self,node): 
     if self.length == 0: 
      self.insertHead(node) 
     else: 
      self.insertTail(node) 

    def insertHead(self, data): 
     nodeToBeInserted = Node() 
     nodeToBeInserted.setData(data) 
     if self.length == 0: 
      self.head = nodeToBeInserted 
     else: 
      nodeToBeInserted.setNext(self.head) 
      self.head = nodeToBeInserted 
     self.length = self.length + 1 

    def insertTail(self,data): 
     nodeToBeInserted = Node() 
     nodeToBeInserted.setData(data) 
     currentNode = self.head 

     while currentNode.getNext() != None: 
      currentNode = currentNode.getNext() 
     currentNode.setNext(nodeToBeInserted) 
     self.length = self.length + 1 

    def insertAtPosition(self,data, position): 
     if position > self.length or position < 0: 
      print("Invalid position!, The size of the Linked List is:%s"%self.length) 
     else: 
      if position ==0: 
       self.insertHead(data) 
      else: 
       nodeToBeInserted = Node() 
       nodeToBeInserted.setData(data) 
       currentNode = self.head 
       count = 0 
       while count < position - 1: 
        currentNode = currentNode.getNext() 
        count = count + 1 
       nodeToBeInserted.setNext(currentNode.getNext()) 
       currentNode.setNext(nodeToBeInserted) 
       self.length = self.length+1 

ll = LinkedList() 
ll.insertNode(1) 
ll.insertNode(2) 
ll.insertNode(3) 

我看到的错误是:

Traceback (most recent call last): 
    File "C:/Users/XPS 13/PycharmProjects/DataStructures/LinkedList/Implementation/SinglyLinkedList.py", line 154, in <module> 
ll.insertNode(2) 
    File "C:/Users/XPS 13/PycharmProjects/DataStructures/LinkedList/Implementation/SinglyLinkedList.py", line 92, in insertNode 
self.insertTail(node) 
    File "C:/Users/XPS 13/PycharmProjects/DataStructures/LinkedList/Implementation/SinglyLinkedList.py", line 121, in insertTail 
while currentNode.getNext() != None: 
TypeError: getNext() missing 1 required positional argument: 'self' 

Process finished with exit code 1 

如果有人能请解释一下我的这个错误是可以理解的原因。

谢谢。

+0

你应该使用'x不是None'而不是'x!= None'。有关更多信息,请参阅PEP 8。 http://pep8.org/ –

回答

0

你使你的代码错误:

Node类:

self.next = Node 

你为什么让这种说法?将课堂本身分配给下一个是不合理的。它应该是:

self.next = None 

另一件事,我想建议是你最好设计为每个类的好__init__功能。将一个类中的__init__函数想象为该类的构造函数。

在你的__init__函数中,没有提供参数,这意味着当你实例化类时,你不能传递任何数据给它。在实践中,我们总是需要提供一些数据来实例化一个类。例如,我们以Node类为例,当我们使用它时,我们通常已经知道这个节点应该存储的数据,并且next节点信息可能已知,也可能不知道。所以更好的方式来界定其__init__功能是:

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

下一次,你让新实例data已知道:

node = Node(data=1) 

如果您还知道next属性:

node = Node(data=1, next=next) 

这使你更方便,无需调用setX函数。

+0

谢谢你,我做了这个改变这个工作 –

0

看起来你已经有了一个错字就在这里:

class Node: 

    def __init__(self): 
     self.data = None 
     self.next = Node 

这应该是self.next = None

你得到的原因getNext() missing 1 required positional argument是因为最终insertTail到达链表的末尾,并且Node类型被分配到currentNode。因此,下次您拨打currentNode.getNext()时,实际上您会调用Node.getNext(),这会引发错误,因为没有节点实例可以隐式分配给self

+0

除此之外,在方法setData()的定义中应该有一个冒号,但我认为它不在OPs中,因为复制错误。 – seanmus

+0

非常感谢你 –

0

while currentNode.hasNext总是如此,因为它是一种方法。

另一方面,while currentNode.hasNext()可能在某些时候是错误的。


self.next = Node表示该类是下一个。

另一方面,self.next = Node()会产生新的实例。

但我想你不想这样做,因为它会尝试创建一个无尽的链表,所以self.next = None可能会更好。

这将导致currentNode = currentNode.getNext()的类分配给currentNode再后来,到currentNode.getNext()下一个电话实际上是调用Node.getNext()这将导致此错误。