假设我们正在尝试在 Python 中实现一个链表,每个 ListNode 定义如下:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
我们还假设我们有一个简单的
1 -> 2 -> 3 -> None
链表,定义如下:
a = ListNode(1)
b = ListNode(2)
c = ListNode(3)
a.next = b
b.next = c
现在,当我持有一个指向
c
的变量并像这样更新自身时:
c = c.next
我预计来自
a
的链表将如下所示: 1 -> 2 -> None
因为节点 c
已更新。然而,令我惊讶的是,来自a
的链表仍然保持着原来的形式:1 -> 2 -> 3 -> None
。
为什么会这样?难道变量
c
不保存对该 ListNode
对象的实际引用吗?因此,当我们从节点 a
看到整个列表时,对自身的更改应该反映出来吗?
对名称(变量)的赋值永远不会改变数据结构,就像设置对象的属性一样。
这是您的链接列表:
a:┐ b:┐ c:┐
│ │ │
┌───┴───────┐ ┌───┴───────┐ ┌───┴───────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
分配
c = c.next
后,您将获取 c.next
的值(即 None
)并将其分配给 c
名称:
a:┐ b:┐ c: None
│ │
┌───┴───────┐ ┌───┴───────┐ ┌───────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
当您希望
b.next
变为 None
时,您确实必须将其分配给 b.next
。请注意,b.next
是一个与名称 c
不同的属性。