2016-04-10 4 views
0

Так что для практики структуры данных на разных языках я решил создать Связанный список в python.Ошибка при создании LinkedList

Теперь вот мой код до сих пор, она все еще далека от завершения, но я столкнулся с этой ошибкой, и я не могу показаться, чтобы указать на себя, где она исходит от:

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

Здесь ошибка:

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]

ответ

1
  1. Во-первых, чтобы ответить на ваш вопрос, это именно то, почему вы получаете ошибку:

Вы делаете head = LinkedNode(value), ожидая LinkedList «s head будут перезаписаны. Но вместо этого происходит то, что вы создаете локальную переменную с именем head и присваиваете ей значение LinkedNode(value). В результате head всегда None. И вы, очевидно, не можете сделать None.nextNode (потому что это не объект).

Решение: Что вам действительно нужно, это self.head = LinkedNode(value). self - ссылка на объект, с которым вы работаете.

  1. Во-вторых, в вашем коде есть несколько вещей. Например:

a. Просто установив head на новый узел, вы потеряете ссылку на ранее существующие узлы.

Решение: Что вам нужно:

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

б. toString - популярный способ представления объектов в виде строк, в других языках программирования, но способ сделать это путем переопределения методов объекта __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 и т. Д.), Но я не буду пытаться их исправить, так как у нас есть решение выше.

+0

Ahh, я понимаю, что вы подразумеваете под «путинским» способом делать вещи, и таким образом я бы просто сделал print (repr (list)) 'или' str', если я тоже решил использовать это. Что было бы лучше сделать? Будут ли люди удобны представлению toString, а также использовать питоновское представление рядом? – madcrazydrumma

+1

Всегда рекомендуется не дублировать код (имея как '__str __()', так и 'toString'). Кроме того, вам даже не нужно делать 'print (repr (list))'. Простой 'print (list)' будет автоматически вызывать метод '__str __()' :) – th3an0maly

+0

Ahh okay, что хорошо знать! Тогда я буду придерживаться метода '__str __()'! – madcrazydrumma

1

Ваш метод addToHead не имеет побочных эффектов. Возможно, вы имели в виду

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

Кроме того, toString будет разбиваться на пустые списки.

+0

Я думаю, что есть проблема с этим. Голова может даже не существовать, поэтому nextNode будет равно null – madcrazydrumma

+1

Да, если headNode None, это означает, что вы вставляете в пустой список и голова.nextNode должен быть None, потому что после вставки будет только один узел (который является главой) – Joni

Смежные вопросы