You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中链表与数组赋值的差异及链表尾插代码的逻辑困惑

Python中链表与数组赋值的差异及链表尾插代码的逻辑困惑

嘿,我完全懂你这种困惑的感觉!咱们一点点拆解清楚这个问题:

首先先看你举的数组例子:

a = [1,2,3,4,5,6]
b = a
for i in range(5):
    b.append(i)

这里b = a是让变量b和a指向同一个数组对象。数组是可变容器,当你用b.append()的时候,你是在修改这个共享的数组对象本身,所以a和b作为这个对象的两个引用,自然都会看到变化。

接下来回到链表的代码,咱们一步步看逻辑:

def insertNodeAtTail(head, data): 
    if head is None: 
        head = SinglyLinkedListNode(data) 
        return head 
    current_head = head 
    while current_head.next: 
        current_head = current_head.next 
    current_head.next = SinglyLinkedListNode(data)
    return head

这里的关键是要区分修改引用指向和修改对象属性:

  • 一开始current_head = head,确实是让current_head和head指向同一个头节点对象。
  • 但进入循环后,current_head = current_head.next这一步,是把current_head的引用切换到了下一个节点,而不是修改原来的节点!这时候head还是稳稳指向最初的头节点,完全没动。
  • 当循环结束时,current_head已经指向了链表的最后一个节点,这时候current_head.next = SinglyLinkedListNode(data)是修改最后一个节点的next属性,把新节点挂到链表末尾——这一步是在修改节点对象的内容,而不是改变head或者current_head的引用指向。

所以整个过程中,head始终指向链表的第一个节点,返回它自然符合题目要求;而如果返回current_head,你返回的是刚插入的最后一个节点,不是头节点,结果当然错了。

简单总结一下:

  • 数组的赋值是让两个变量共享同一个容器对象,修改容器内容会影响所有引用。
  • 链表的遍历中,current_head只是一个“移动的指针”,它的引用不断切换节点,但head的引用固定在头节点,我们修改的是节点的属性,不是head的指向。

这样是不是就清晰多啦?

备注:内容来源于stack exchange,提问作者gradstudent1995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:48:09