LeetCode 109题Python解法中self.head的使用疑问解析
为什么在有序链表转BST的解法中要用
self.head而非普通变量? 在LeetCode第109题的这类递归解法里,用self.head而不是普通局部变量(比如copyOfHead = head),核心原因是递归过程中需要共享并持续修改同一个链表指针,具体来说:
局部变量的生命周期限制
如果定义普通局部变量copyOfHead,它只存在于当前函数的栈帧中。当进入递归调用时,每一层递归都会创建新的局部变量副本,修改内层的copyOfHead不会影响外层的变量。这就导致你无法在递归构建左子树、根节点、右子树的过程中,持续移动同一个链表指针来按顺序取节点。实例变量的共享特性
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
相关产品推荐
相关产品推荐

