我对编码非常陌生,我有一个关于在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个问题:
str代码的代码是“乱码”还是可接受的语法?
我将如何打印节点的名称,而不是打印prev节点和下一节点的位置,而不是打印节点的名称。 [node7][82][node9]
希望这是有道理的,谢谢你的帮助!
答案 0 :(得分:1)
而不必为每个self.name
创建需要初始化的Node
。您可以添加self.id
初始化,并在每次创建时增加静态counter
。
第1步 - 添加静态counter
并初始化self.id
属性
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]