打印链接列表中的节点

时间:2016-12-07 19:03:19

标签: python linked-list repr

我对编码非常陌生,我有一个关于在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

如果我打印(node1),我得到:

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

完全符合我的要求。

所以有2个问题:

  1. str代码的代码是“乱码”还是可接受的语法?

  2. 我将如何打印节点的名称,而不是打印prev节点和下一节点的位置,而不是打印节点的名称[node7][82][node9]

  3. 希望这是有道理的,谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

counter0开始,可通过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__函数以获取idprev

next

self.prevself.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]