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

为何链表插入函数未更新root却仍能正常运行?

链表尾插函数返回root的逻辑解释

你的代码

def insert(self, root, item):
    # Given the root/head of a Linked List, append the item to the end of the Linked List
    # Function should return the root/head of the Linked List
    if root is None:
        return Node(item)
    else:
        current = root
        while current.next is not None:
            current = current.next
        current.next = Node(item)
        return root

你的疑问

我无法理解上述链表插入函数的return语句逻辑。在代码中,我并未对root进行任何更新操作,但返回root后该insert函数却能正常执行。我原本认为这种情况不可行,因为root与初始状态完全相同,恳请您帮我解释其中原理。


核心解释:链表是引用类型,操作的是内存中的对象本身

你困惑的根源是没搞清楚Python里引用类型的工作逻辑:

  • 当链表不为空时,root是指向链表头节点的引用(相当于指向内存地址的指针)。你确实没修改root这个引用本身,但你修改了root指向的链表结构里的节点。
  • 代码里的current是从root复制来的引用,顺着current.next遍历到链表最后一个节点后,给这个节点的next属性赋值为新节点——这一步直接修改了原链表的末尾,把新节点接了上去。
  • root作为头节点的引用,它指向的还是原来那个链表的开头,只不过这个链表的长度已经被你修改了。返回root只是把这个头节点的引用返回给调用者,这样调用者就能通过这个引用访问到更新后的完整链表。

两种场景的具体说明

  • 当链表为空(root is None)时,需要创建新节点作为头节点,所以直接返回这个新节点的引用。
  • 当链表不为空时,头节点本身不需要改变,改变的是链表的末尾节点,所以直接返回原来的头节点引用就行——因为它指向的链表已经被修改了。

举个直观例子:
假设原链表是A -> B,root指向A。调用insert(root, C)后,代码会找到B,把B的next改成C,链表变成A -> B -> C。root依然指向A,返回它之后,调用者拿到的还是A,但通过A能遍历到新增的C。

内容的提问来源于stack exchange,提问作者Jangaver 061

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:06