2016-12-07 111 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))) 

很明显,我有更多的代码清单类本身。比方说,我有两个节点的双向链表:

节点1:关键21
节点2:关键10
头 - >节点1 < ==>节点2

如果我打印(节点1),我得到:

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

which works exa如何我想要的。

所以2个问题:

  1. 这段代码 “混乱” 或可接受的语法为海峡方法?

  2. 而不是打印的位置prev和next节点的,我怎么会打印名节点而不是如[node7][82][node9]

希望这是有道理的,并感谢您的帮助!

+0

1.这很好。 2.您的节点没有名称。如果你想要他们有名字,那么你必须有一个'self.name'属性。链表的一个属性是单个noes不知道他们在哪里,只有他们的邻居。 –

+0

*节点的名称* - 至少,每个节点实例应具有'name'属性 – RomanPerekhrest

+0

@PatrickHaugh感谢您的回复。 OK,所以一旦我创建了一个节点,它就不知道它自己的名字了......我必须像你说的那样设置一个self.name属性......知道了!我猜这是不常见的做法,尽管它并不需要以漂亮的格式打印节点。 – greenslime

回答

1

而不必创建self.name需要初始化为每个Node。您可以添加一个self.id,使用在每次创建时递增的静态counter进行初始化。

步骤1 - 从0添加静态counter并初始化self.id属性

counter开始并且是通过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__函数来获取previdnext

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]