2016-04-10 11 views
0

So für die Praxis der Datenstruktur in verschiedenen Sprachen, entschied ich mich, eine verknüpfte Liste in Python zu erstellen.Fehler beim Erstellen einer LinkedList

Hier ist mein Code so weit, es noch lange nicht getan ist, aber ich habe diesen Fehler aufgetreten ist, und ich kann nicht scheinen, um mich zu zeigen, wo es herkommt:

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() 

Hier wird Der Fehler:

Traceback (most recent call last):

File "path/linkedList.py", line 52, in list.toString()

File "path/linkedList.py", line 44, in toString

while tmp.nextNode != None: 

AttributeError: 'NoneType' object has no attribute 'nextNode' [Finished in 0.138s]

Antwort

1
  1. Erstens Ihre Frage zu beantworten, das ist genau das, warum Sie den Fehler, wenn es darum:

Du head = LinkedNode(value) tun, die LinkedList ‚s head erwartet überschrieben. Stattdessen erstellen Sie eine lokale Variable mit dem Namen head und weisen ihr den Wert LinkedNode(value) zu. Als Ergebnis ist head immer None. Und Sie können natürlich nicht None.nextNode tun (weil es kein Objekt ist).

Lösung: Was Sie tatsächlich brauchen, ist self.head = LinkedNode(value). self ist eine Referenz auf das Objekt, mit dem Sie arbeiten.

  1. Zweitens sind an Ihrem Code einige Fehler aufgetreten. Zum Beispiel:

a. Wenn Sie einfach head auf den neuen Knoten setzen, verlieren Sie den Bezug auf die zuvor vorhandenen Knoten.

Lösung: Was Sie brauchen, ist:

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

b. toString ist eine beliebte Möglichkeit zur Darstellung von Objekten als Strings in anderen Programmiersprachen, aber die Python Weg ist es durch Überschreiben der __str__() und __repr__() Methoden für das Objekt.

Lösung (I mit Ihrem Format stecken haben, obwohl es einige Wechsel verwenden könnte;):

def __repr__(self): 
    tmp = self.headNode 
    buffer = [] 
    while tmp is not None: 
     buffer.append(tmp.value) 
     tmp = tmp.nextNode 
    return "[" + ", ".join(map(str, buffer)) + "]" 

c. Es gibt mehrere Dinge falsch über die Methode (headNode wird nicht gedruckt, wird fehlschlagen headNode ist None etc.), aber ich werde nicht versuchen, sie zu beheben, wie wir die Lösung oben haben.

+0

Ahh ich sehe, was du mit der 'pythonischen' Art zu tun meinst und auf diese Weise würde ich einfach 'print (repr (list)) machen 'oder' str' wenn ich das auch benutze. Was wäre eine bessere Sache zu tun? Wären die Leute mit einer toString-Repräsentation vertraut, und würden sie gleichzeitig eine pythonische Darstellung verwenden? – madcrazydrumma

+1

Es wird immer empfohlen, keine Code-Duplizierung zu haben (mit '__str __()' und 'toString'). Außerdem müssen Sie nicht einmal 'print (repr (list))' machen. Eine einfache 'print (list)' würde automatisch die '__str __()' Methode aufrufen :) – th3an0maly

+0

Ahh okay das ist gut zu wissen! Ich bleibe dann bei der '__str __()' Methode! – madcrazydrumma

1

Ihre addToHead-Methode hatte keine Nebenwirkungen. Möglicherweise meintest du

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

ToString wird auch für leere Listen abstürzen.

+0

Ich denke, es gibt auch ein Problem damit. Der Kopf existiert möglicherweise nicht einmal, so dass der nextNode sowieso null wäre. – madcrazydrumma

+1

Ja, wenn headNode None ist, bedeutet das, dass Sie in eine leere Liste einfügen und head.nextNode sollte None sein, denn nach dem Einfügen wird es nur einen Knoten geben (was der Kopf ist) – Joni

Verwandte Themen