链表中的Python ListNode对象更新无法按预期工作

问题描述 投票:0回答:1

假设我们正在尝试在 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
看到整个列表时,对自身的更改应该反映出来吗?

python linked-list
1个回答
0
投票

对名称(变量)的赋值永远不会改变数据结构,就像设置对象的属性一样。

这是您的链接列表:

  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
不同
的属性。

© www.soinside.com 2019 - 2024. All rights reserved.