深度优先扁平化嵌套List需用栈模拟递归:初始化栈并压入顶层列表,循环弹出元素,若为List则逆序压入其元素,否则加入结果;Java用ArrayDeque、Python用list实现,注意空值、循环引用及泛型擦除。
用 for 循环对嵌套 List(如
)做深度优先扁平化,关键在于**模拟递归调用栈**:把待处理的子列表逐个压入栈,每次取出一个,遍历其元素——遇到普通元素就收集,遇到子列表就再压入栈。这样能保证“先深入再平铺”,符合深度优先顺序。
核心思路:用栈替代递归
深度优先不是靠“一层层 for 套 for”实现的(那只能处理固定层数),而是靠显式维护一个栈来记住“接下来该展开哪个子结构”。for 循环负责逐个处理栈顶,不关心嵌套有多深。
初始化一个栈(如
或
),把原始嵌套列表压入
循环直到栈为空:弹出一个元素
若它是目标类型(如
、
),直接加入结果列表
若它是
,则将其所有元素**逆序**压入栈(保证第一个子项最先被处理,维持 DFS 顺序)
Java 示例:扁平化 List
>(支持任意深度)
注意:这里用
模拟栈,用
判断类型:
}
例如输入
,输出为
(深度优先:1 → 进入 [2,3] → 2 → 3 → 回退 → 4)。
Python 中用 list 模拟栈(同样 for 驱动)
Python 没有原生栈,但用
和
可高效模拟:
调用
同样得
。
注意事项与边界处理
实际使用时需考虑这些细节:
空值安全
:在压栈前检查
,避免
或
循环引用
:如果嵌套结构中存在自引用(如
),需额外用
记录已访问对象 ID,否则无限循环
泛型擦除
(Java):运行时无法判断
还是
,所以统一用
处理;若需强类型,可传入 Class
做运行时校验
性能提示
:频繁
小对象开销低;若嵌套极深(万级层级),栈模拟比递归更安全,避免栈溢出
List>
StackDequeStringIntegerListArrayDequeinstanceofList[[1, [2, 3]], 4][1, 2, 3, 4]list.append()list.pop()def flatten_dfs(nested):
result = []
stack = [nested] # 顶层入栈
while stack:
item = stack.pop()
if isinstance(item, list):
# 逆序扩展:让第一个元素最后进栈,最先出栈
stack.extend(reversed(item))
else:
result.append(item)
return resultflatten_dfs([[1, [2, 3]], 4])[1, 2, 3, 4]item != nullNullPointerExceptionTypeErrora.add(a)SetListListObjectpush/pop