Python 链表中 ListNode 对象更新不符合预期

0 投票
1 回答
20 浏览
提问于 2025-04-14 15:36

假设我们想在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 是完全不同的。

撰写回答