我有一项任务,我必须通过有向图创建运行深度优先搜索,并将遍历作为链接列表返回。我相信DFS的代码是正确的,因为它似乎与教科书相匹配,并且当我走过步骤时它是有道理的。如果我在每个顶点被标记时将其打印出来,它会使打印机一遍又一遍地导致堆栈溢出错误。
private static boolean[] marked;
private static LinkedList<Integer> ret;
public static LinkedList<Integer> dfs(Digraph g, int s) {
marked = new boolean[g.V()];
ret = new LinkedList<>();
marked[s] = true;
System.out.print(s);
ret.add(s);
for (int i : g.adj(s)) {
if (!marked[i]) {
dfs(g, i);
}
}
return ret;
}
我的猜测是每次调用dfs时都会重置boolean []。我试过把它放在方法之外,但因为方法是静态的,我不能改变它(给定赋值参数),我得到一个静态非静态问题,我不太确定如何解决。
答案 0 :(得分:2)
是的,你的问题确实是因为布尔值在某种意义上被重置了。重置发生在这一行:
marked = new boolean[g.V()];
在这一行中,您将在新函数调用中创建一个新的布尔数组,该数组与原始数组不同。然后,您正在检查不包含旧数组更改的新数组。
我建议您创建一个初始化dfs进程的包装函数,然后将数组传递给dfs函数的每次调用。
如果您不想添加额外的参数,只需在方法之外创建一个静态变量:
private static boolean[] marked;
然后在适当时初始化