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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:03