2016-09-21 77 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()這將導致此錯誤。