2016-09-21 8 views
0

私は初心者です。私はPythonプログラミングを学び始めました。私はエラーで立ち往生しています。リンクされたリストタイプのエラー

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 

誰かが私にそれが理解されるであろう。このエラーの理由を説明してくださいすることができた場合:私は見ていますエラーがある型エラーに

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) 

を取得します。

ありがとうございます。

class Node: 

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

self.next = None次のようになります。あなたは右ここにタイプミスを持っているよう

+0

'x!= None'ではなく' x is None'を使うべきです。詳細はPEP 8を参照してください。 http://pep8.org/ –

答えて

0

あなたはあなたのコードでミスを犯してきましたか?クラス自体を次へ割り当てることは不合理です。それは次のようになります。

self.next = None 

もう一つ、私が提案したいあなたは、より良いクラスごとに良い__init__機能を設計したいです。クラスの__init__関数をクラスのコンストラクタとして考えてください。

__init__関数では、引数は指定されていません。つまり、クラスをインスタンス化すると、そのクラスにデータを渡すことはできません。実際には、クラスをインスタンス化するためのデータを提供する必要があります。たとえば、Nodeクラスを使用しましょう。使用する場合、このノードに保存する必要のあるデータをよく知っていることが多く、ノード情報はnextです。だから、その__init__関数を定義するためのより良い方法がある:あなたもnextプロパティを知っている場合

node = Node(data=1) 

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

次回、あなたはdata財産知られて新しいインスタンスを作る

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

これは、setX機能を呼び出すことなく、より便利になります。

+0

ありがとう、私はこの変更を作った –

0

が見えます。

結局insertTailは、リンクリストの最後に達すると、NodeタイプがcurrentNodeに割り当てられているので、あなたがgetNext() missing 1 required positional argumentを取得している理由があります。したがって、次回にcurrentNode.getNext()を呼び出すと、実際にNode.getNext()が呼び出されます。暗黙的にselfに割り当てるNodeインスタンスが存在しないため、エラーが発生します。

+0

これに加えて、setData()メソッドの定義にはコロンが必要ですが、コピーエラーのためOPのポストにはないと仮定します。 – seanmus

+0

ありがとうございました –

0

while currentNode.hasNextは、メソッドであるため、常にtrueです。

一方、while currentNode.hasNext()は、ある時点でfalseになることがあります。


self.next = Nodeは、次のクラスを意味します。一方、self.next = Node()は新しいインスタンスを作成します。

しかし、それは無限のリンクリストを作成しようとしているので、あなたはそれが欲しくないと思うので、self.next = Noneが良いかもしれません。

これはcurrentNodeにクラスを割り当てるためにcurrentNode = currentNode.getNext()を引き起こし、その後、currentNode.getNext()次の呼び出しは、実際にこのエラーが発生したNode.getNext()を呼んでいます。

self.next = Node 

は、なぜあなたはこの文を作るのです。Nodeクラスで

関連する問題