python中的链表类可以在构造函数中取'next'值吗?

mdfafbf1  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(110)

为了方便起见,我想使用一个链表类Node,如下所示:

a = Node(3)
b = Node(2, a)
c = Node(1, b) # c = (1) -> (2) -> (3)

我尝试了下面的类定义

class Node:
    def __init__(self, val: int, next_node: Node = None):
        self.val = val
        self.next = next_node

...但是我在构造函数中得到了一个关于NodeNameError
我知道这是递归的,但我也见过在其他语言中这样做,在Python中可能吗?

yizd12fk

yizd12fk1#

使用typing.Self表示Node类型。

from typing import Self
class Node:
    def __init__(self, val: int, next_node: Self = None):

或者,使用字符串'Node'

d6kp6zgx

d6kp6zgx2#

在Python中,你可以通过使用一个递归结构来定义一个链表类,这个递归结构类似于你给出的例子,为了避免你遇到的NameError,你必须把类定义放在init方法之外,下面是你的代码的修正形式:

class Node:
    def __init__(self, val: int, next_node: 'Node' = None):
        self.val = val
        self.next = next_node

a = Node(3)
b = Node(2, a)
c = Node(1, b)  # c = (1) -> (2) -> (3)

需要注意的是,next node的类型提示用字符串“Node”代替了类名Node,因此Python能够识别类引用,即使它还没有被定义。

相关问题