见注释
另外:注意 Java 的语言特性,因为 Java 函数参数传的是对象引用,所以向 res 中添加 path 时需要拷贝一个新的列表,否则最终 res 中的列表都是空的。
class Solution {
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
LinkedList<Integer> path = new LinkedList<>();
traverse(graph,0,path);
return res;
}
public void traverse(int[][] graph,int s,LinkedList<Integer> path){
//首先加入路径
path.addLast(s);
int n = graph.length;
//若是目的地,则将路径加入res,然后把路径的最后一个移除,也就是回溯
if(s == n-1){
res.add(new LinkedList<>(path));
path.removeLast();
return;
}
//对这个节点的所有邻居for循环放入递归中
for(int v: graph[s]){
traverse(graph,v,path);
}
//走到头后发现不对就回退
path.removeLast();
}
}