LeetCode210递归对列表做原地修改返回空列表问题咨询
直接问题原因
你拿到空返回值的核心原因是Python中list.reverse()是原地修改方法,执行后仅对列表本身做反转,返回值为None,你直接return stack.reverse()等价于返回None。
修改方案二选一:
# 方案1:先反转再返回 stack.reverse() return stack # 方案2:用切片生成新的反转列表返回 return stack[::-1]
递归中对列表做原地修改的常见注意事项
- 明确区分可变对象方法的返回值:
list.append()、list.sort()、list.extend()、list.pop()这类对列表本身做修改的方法,返回值都是None,不要直接将这类方法的调用结果作为返回值。 - 不要在递归函数内对传入的可变对象做重新赋值:如果你在递归函数中写了类似
stack = []的语句,会将原本指向外部列表的局部引用替换为新的列表对象,后续所有修改都只会作用于这个局部变量,不会影响外部的原列表。 - 做好重复访问和边界判断:你的现有代码还存在功能缺陷,比如仅从节点0启动DFS,没有处理存在多个无前置依赖课程的场景,也没有检测环的逻辑,无法通过LeetCode全部用例,建议提前构建邻接表存储课程依赖关系,同时额外加访问状态标记(未访问、访问中、已访问)避免重复遍历和检测环。
- 不需要额外返回可变对象:只要你始终操作的是原列表的引用,递归中对列表做的所有原地修改都会直接作用于原对象,递归结束后直接读取原列表即可,不需要通过函数返回值传递。
修正后可通过测试用例的参考代码
class Solution(object): def findOrder(self, numCourses, prerequisites): # 构建邻接表 adj = [[] for _ in range(numCourses)] for cur, pre in prerequisites: adj[pre].append(cur) # 访问状态:0=未访问,1=访问中,2=已访问 visited = [0]*numCourses stack = [] # 遍历所有节点,避免漏掉无前置依赖的独立节点 for i in range(numCourses): if visited[i] == 0: if not self.dfs(i, adj, visited, stack): return [] stack.reverse() return stack def dfs(self, node, adj, visited, stack): # 遇到访问中的节点说明有环 if visited[node] == 1: return False if visited[node] == 2: return True visited[node] = 1 for next_node in adj[node]: if not self.dfs(next_node, adj, visited, stack): return False visited[node] = 2 stack.append(node) return True
内容的提问来源于stack exchange,提问作者ajp093
相关产品推荐
相关产品推荐

