如何在Python嵌套函数中使用全局变量?解决回溯场景下num未定义问题
回溯函数变量问题及链表删除报错修复
报错原因
你在嵌套的huisu函数里对num做了赋值操作,Python会默认把num当成这个嵌套函数的局部变量,但你在赋值前先判断了num == 0,这就导致局部变量还没定义就被引用,触发了num未定义的错误。
解决方法
这里提供两种可行的方案,同时修复你原代码里链表操作的逻辑问题:
方案一:用nonlocal声明外部变量
用nonlocal告诉Python,num属于外层函数的变量,不是当前嵌套函数的局部变量:
class Solution: def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]: num = n # 加dummy节点,避免删除头节点的边界问题 dummy = ListNode(0) dummy.next = head def huisu(node): nonlocal num if not node: return # 先递归到链表末尾 huisu(node.next) num -= 1 # 当num减到-1时,当前节点就是目标节点的前一个节点 if num == -1: node.next = node.next.next huisu(dummy) return dummy.next
方案二:用可变对象包装数值
把num放进列表里(列表是可变类型),嵌套函数里修改列表元素不会被判定为局部变量:
class Solution: def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]: # 用列表包装n,避免局部变量问题 num = [n] dummy = ListNode(0) dummy.next = head def huisu(node): if not node: return huisu(node.next) num[0] -= 1 if num[0] == -1: node.next = node.next.next huisu(dummy) return dummy.next
原代码的其他问题修正说明
- 原代码里对
head的赋值操作都是局部变量修改,不会影响原链表结构,所以删除逻辑根本没生效; - 没处理删除头节点的情况,比如当n等于链表总长度时,直接删头节点需要额外判断,加
dummy节点可以统一处理所有情况; - 回溯时的计数逻辑调整:递归到链表末尾后开始计数,当计数到-1时,当前节点就是要删除节点的前一个节点,这时候修改
next指针才能完成删除。
内容的提问来源于stack exchange,提问作者王洲洋
相关产品推荐
相关产品推荐

