关于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],我们逐步骤看:
- 初始化阶段:创建一个值为0的“哑节点”,
cur和dummy都指向它。此时dummy.next和cur.next都是None。 - 第一次循环(e=1):
cur.next = ListNode(1):给当前cur指向的哑节点的next属性赋值,指向新创建的val=1的节点。这时候dummy.next也同步变成了这个val=1的节点——因为dummy和cur还指向同一个哑节点。cur = cur.next:cur移动到新创建的val=1节点上,此时cur和dummy不再指向同一个节点。
- 第二次循环(e=2):
cur.next = ListNode(2):给当前cur(val=1节点)的next赋值为val=2的节点。cur = cur.next:cur移动到val=2节点。
- 第三次循环(e=3):
cur.next = ListNode(3):给当前cur(val=2节点)的next赋值为val=3的节点。cur = cur.next:cur移动到val=3节点。
- 返回结果:循环结束后,
dummy仍然指向最初的哑节点,它的next就是第一次循环时创建的val=1节点——也就是整个新链表的头节点。
为什么要用哑节点?
这是链表构建的常用技巧:用哑节点可以避免处理“链表为空”或“头节点需要特殊判断”的场景,不用额外区分第一个元素是否要作为头节点,统一通过cur.next添加新节点,最后返回哑节点的next就能拿到真正的链表头,代码逻辑更简洁。
内容的提问来源于stack exchange,提问作者Jye
相关产品推荐
相关产品推荐

