【发布时间】:2021-05-27 19:40:08
【问题描述】:
我真的被 Leetcode 中使用的 Python 链表数据结构弄糊涂了。不知道是不是 Leetcode 创建的特定 ListNode 结构引起的,还是我对 Python 有一些误解。例如,下面这段代码很简单,一目了然:
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def main():
# Instantiate a linked list 1 -> 2 -> 3
a = ListNode(1)
b = ListNode(2)
c = ListNode(3)
a.next = b
b.next = c
print(a) # a is 1 -> 2 -> 3
b.next = None
print(a) # a is 1 -> 2
b = None
print(a) # a is still 1 -> 2, why changing b doesn't change a, but changing b.next changes a???
假设我有一个链表 a -> b -> c。当我设置b.next = None,a.next.next = None。但是,让我困惑的是,当我设置b = None时,a.next不会变成None。操作b和b.next有什么区别,为什么它们对a有不同的影响?
【问题讨论】:
-
你并没有真正的链表数据结构。你有一个
ListNode类,它的实例可以使用 来构建一个链表,但是没有一个类可以封装链表的概念并提供像append、insert、@987654334 这样的方法@、remove等 -
至于您的实际问题,请阅读nedbatchelder.com/text/names.html。赋值永远不会改变现有的值,只有 name 被赋值。
-
是的,所以问题可能与
ListNode结构有关?我只是不明白为什么更改b和b.next会产生不同的影响a -
因为分配给
b对同一对象的其他引用没有影响。 -
第一个绑定
a.next = b的读取方式是“使a.next指向当前b指向的同一事物”,然后第二个绑定b = None应该读为“现在让 b 不指向任何东西”。这样看,更清楚一点,第二次绑定对a.next没有影响。
标签: python data-structures linked-list