2016-12-07 5 views
0

Я очень новичок в кодировании, и у меня есть основной вопрос о печати узла в двусвязном списке в Python.Печать узла в связанном списке

class Node(): 
    def __init__(self, key = None, prev = None, next = None): 
     self.key = key 
     self.prev = prev 
     self.next = next 

    def __str__(self): 
     return ('[%s][%d][%s]' % (repr(self.prev), self.key, repr(self.next))) 

Очевидно, что у меня тогда есть еще код для самого класса списка. Скажем, у меня есть дважды связанный список с двумя узлами:

node1: ключ 21
node2: ключ 10
голова -> node1 < ==> node2

Если я печатаю (узел1), я получаю:

[*location of prev node*][21][*location of next node*] 

который работает exa Как я хочу.

Так 2 вопроса:

  1. этот код "грязный" или приемлемый синтаксис для метода ул?

  2. Вместо печати расположения предыда и следующих узлы, как бы я напечатать имен узлов вместо, например, [node7][82][node9]?

Надеюсь, что это имеет смысл и благодарит за любую помощь!

+0

1. Это нормально. 2. У ваших узлов нет имен. Если вы хотите, чтобы у них были имена, вам нужно было бы использовать атрибут 'self.name'.Одним из свойств связанного списка является то, что индивидуальные ноэ не знают, где они находятся в списке, а только их соседи. –

+0

* имена узлов * - по крайней мере, каждый экземпляр узла должен иметь атрибут 'name' – RomanPerekhrest

+0

@PatrickHaugh спасибо за ваш ответ. ОК, поэтому, как только я создал узел, он не знает собственного имени ... Мне нужно настроить атрибут self.name, как вы сказали ... понял! Я предполагаю, что это не обычная практика, но потому, что не нужно печатать узлы в симпатичном формате. – greenslime

ответ

1

Вместо того, чтобы создавать self.name, необходимо инициализировать для каждого Node. Вы можете добавить self.id, инициализированный статическим counter, увеличивающимся при каждом создании.

Шаг 1 - добавить статический counter и инициализировать атрибуту self.id

The counter начинается с 0 и доступна через Node.counter.

class Node(): 
    counter = 0 
    def __init__(self, key = None, prev = None, next = None): 
     Node.counter += 1 
     self.id = Node.counter 
     self.key = key 
     self.prev = prev 
     self.next = next 

Шаг 2 - изменить функцию __str__, чтобы получить id из prev и next

Название self.prev и self.next только отображается, когда он не None.

Восстановить название класса с помощью self.__class__.__name__.

def __str__(self): 
    sprev = repr(self.prev) 
    if self.prev != None : 
     sprev = '%s%d' % (self.__class__.__name__, self.prev.id) 
    snext = repr(self.next) 
    if self.next != None : 
     snext = '%s%d' % (self.__class__.__name__, self.next.id) 
    return ('[%s][%d][%s]' % (sprev, self.key, snext)) 

Вот некоторые примеры:

>>> node1 = Node(21) 
>>> print(node1) 
[None][21][None] 
>>> node2 = Node(10,node1) 
>>> print(node2) 
[Node1][10][None] 
>>> node3 = Node(11,node2,node1) 
>>> print(node3) 
[Node2][11][Node1]