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

关于Python中lst2link函数dummy.next指向链表头的疑问

理解lst2link函数中dummy.next指向链表头的原因

我正尝试理解这段非本人编写的代码逻辑,重点想搞懂lst2link函数的执行过程:函数初始时创建cur和dummy两个ListNode变量,随后以初始cur为基础构建链表,最终返回dummy.next。运行后发现dummy.next是构建出的链表头,但我没找到明确的指向代码,疑惑它为何会指向链表头?

代码如下:

class ListNode:
   def __init__(self, x):
       self.val = x
       self.next = None


def lst2link(lst):
    cur = dummy = ListNode(0)
    for e in lst:
        cur.next = ListNode(e)
        cur = cur.next
    return dummy.next

核心逻辑:cur和dummy初始指向同一个节点

这行代码是关键:cur = dummy = ListNode(0),这是Python的链式赋值——先创建一个值为0的ListNode节点,然后让cur和dummy两个变量同时指向这个节点的内存地址。也就是说,它们一开始是同一个对象的两个引用,修改其中一个的属性(比如next),另一个的对应属性会同步变化,因为本质上操作的是同一个节点。

一步步拆解执行过程

假设输入列表是[1,2,3],我们逐步骤看:

  1. 初始化阶段:创建一个值为0的“哑节点”,cur和dummy都指向它。此时dummy.next和cur.next都是None。
  2. 第一次循环(e=1):
    • cur.next = ListNode(1):给当前cur指向的哑节点的next属性赋值,指向新创建的val=1的节点。这时候dummy.next也同步变成了这个val=1的节点——因为dummy和cur还指向同一个哑节点。
    • cur = cur.next:cur移动到新创建的val=1节点上,此时cur和dummy不再指向同一个节点。
  3. 第二次循环(e=2):
    • cur.next = ListNode(2):给当前cur(val=1节点)的next赋值为val=2的节点。
    • cur = cur.next:cur移动到val=2节点。
  4. 第三次循环(e=3):
    • cur.next = ListNode(3):给当前cur(val=2节点)的next赋值为val=3的节点。
    • cur = cur.next:cur移动到val=3节点。
  5. 返回结果:循环结束后,dummy仍然指向最初的哑节点,它的next就是第一次循环时创建的val=1节点——也就是整个新链表的头节点。

为什么要用哑节点?

这是链表构建的常用技巧:用哑节点可以避免处理“链表为空”或“头节点需要特殊判断”的场景,不用额外区分第一个元素是否要作为头节点,统一通过cur.next添加新节点,最后返回哑节点的next就能拿到真正的链表头,代码逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:54:36