Обычно односвязный список отслеживает только голову. (А не хвост). Так что self.tail_node = None
обычно не используется.
При работе с linkedlist
или tree
вам будет намного проще работать с рекурсией, а не использовать циклы. Циклы работают нормально, если вы просто хотите просмотреть список, но если вы хотите изменить его, я бы порекомендовал рекурсивное решение.
Как говорится, проблема не в вашем print
, а в вашем append
.
Вы можете НИКОГДА не перемещать головной узел. Вы всегда должны указывать, так что это вызвало проблему:
self.head_node = self.head_node.nextNode
Fix:
def append(self, value):
new_node = Node(value)
if self.head_node is None:
self.head_node = new_node
self.size += 1
else:
temp_head = self.head_node
while temp_head.nextNode is not None:
temp_head = temp_head.nextNode
temp_head.nextNode = new_node
self.size += 1
Рекурсивное решение:
def append(self, value):
new_node = Node(value)
self.size += 1
self.head_node = self.__recursive_append(self.head_node, new_node)
def __recursive_append(self, node, new_node):
if not node:
node = new_node
elif not node.nextNode:
node.nextNode = new_node
else:
node.nextNode = self.__recursive_append(node.nextNode, new_node)
return node
Как говорится, я не осознавал этого до тех пор, пока я не переделал ваш отпечаток, поэтому вот более чистый способ печати с использованием генератора питонов, который может вам помочь.
Генераторы - это то, что вы можете использовать с python, которое вы не можете обычно использовать с другими языками программирования, и это делает что-то вроде , превращая связанный список в список значений действительно легко делать:
def print_values(self, reverse=False):
values = [val for val in self.__list_generator()]
if values:
print("Linked list: " + str(values))
else:
print("Linked List is currently empty.")
def __list_generator(self):
'''
A Generator remembers its state.
When `yield` is hit it will return like a `return` statement would
however the next time the method is called it will
start at the yield statment instead of starting at the beginning
of the method.
'''
cur_node = self.head_node
while cur_node != None:
yield cur_node.node_value # return the current node value
# Next time this method is called
# Go to the next node
cur_node = cur_node.nextNode
Отказ от ответственности:
Генератор хорош, но я сделал это только таким образом, чтобы соответствовать тому, как вы это делали (то есть получать список из списка ссылок). Если список не важен, но вы просто хотите вывести каждый элемент в связанный список, я бы просто сделал это следующим образом:
def print_values(self, reverse=False):
cur_node = self.head_node
if cur_node:
print('Linked list: ', end='')
while cur_node:
print("'{}' ".format(cur_node.node_value), end='')
cur_node = cur_node.nextNode
else:
print("Linked List is currently empty.")