Python 链表中 ListNode 对象更新不符合预期
假设我们想在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
看整个链表时,变化没有反映出来呢?
1 个回答
1
给一个名字(变量)赋值并不会改变数据结构,就像设置一个对象的属性一样。
这是你的链表:
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
是完全不同的。