【问题标题】:Printing a node in a linked list打印链表中的节点
【发布时间】:2017-04-22 20:39:41
【问题描述】:

我对编码很陌生,我有一个关于在 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
头 --> 节点1 节点2

如果我执行 print(node1),我会得到:

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

这正是我想要的。

所以 2 个问题:

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

  2. 我将如何打印节点的 names 而不是打印 prev 和 next 节点的 location,例如[node7][82][node9]?

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

【问题讨论】:

  • 1.没关系。 2. 你的节点没有名字。如果你想让他们有名字,那么你必须有一些self.name 属性。链表的特性之一是各个节点不知道它们在链表中的位置,只知道它们的邻居。
  • 节点名称 - 至少,每个 Node 实例都应该有 name 属性
  • @PatrickHaugh 感谢您的回复。好的,所以一旦我创建了一个节点,它就不知道自己的名字......我必须像你说的那样设置一个 self.name 属性......明白了!我猜这样做并不常见,因为它并不需要以漂亮的格式打印节点。
  • 通常你只是通过它们的内容来引用节点。在大多数情况下,节点对象将持有一个键,该键是对内存中其他内容的引用(即指针)。所以指向内存位置0xdeadbeef的节点将是node 0xdeadbeef
  • 如果你的列表有循环,你的repr会堆栈溢出

标签: python linked-list repr


【解决方案1】:

不必为每个Node 初始化一个self.name。您可以添加一个 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

第二步——修改__str__函数,得到prevnextid

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]

【讨论】:

    猜你喜欢
    • 2023-02-25
    • 2013-05-10
    • 1970-01-01
    • 2022-11-15
    • 2021-12-20
    • 2016-03-31
    • 2020-01-04
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多