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

LeetCode 109题Python解法中self.head的使用疑问解析

为什么在有序链表转BST的解法中要用self.head而非普通变量?

在LeetCode第109题的这类递归解法里,用self.head而不是普通局部变量(比如copyOfHead = head),核心原因是递归过程中需要共享并持续修改同一个链表指针,具体来说:

  1. 局部变量的生命周期限制
    如果定义普通局部变量copyOfHead,它只存在于当前函数的栈帧中。当进入递归调用时,每一层递归都会创建新的局部变量副本,修改内层的copyOfHead不会影响外层的变量。这就导致你无法在递归构建左子树、根节点、右子树的过程中,持续移动同一个链表指针来按顺序取节点。

  2. 实例变量的共享特性
    self.head是类的实例变量,属于整个类实例,所有递归调用的方法都共享这个变量。当你在递归中执行self.head = self.head.next时,所有层级的递归都会看到这个指针的最新状态。这样就能配合中序遍历的递归顺序(左→根→右),依次从有序链表中取出节点,正确构建平衡BST。

举个直观的例子:假设链表是1→2→3→4→5,递归先构建左子树,此时self.head会从1移动到3(左子树构建完成),然后取3作为根节点,再移动到4构建右子树——整个过程指针是连续推进的。而如果用局部变量,每一层递归的指针都是初始的1,根本无法正确推进节点的取用顺序。

总结:这里用self.head就是为了在多层递归调用之间,维护一个全局(相对于当前实例)的、可修改的链表指针,保证按顺序取用链表节点来构建BST。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:20:32