List类的add()方法每次加入的都是对存放在堆中对象的引用地址。
可能导致只要改变了List中的某个元素,列表中其它元素的内容都会跟着一起被改变的异常了。
力扣113题:
113. 路径总和 II
在存入路径的时候我使用了以下的错误代码,这样导致result存的都只是sum所对应对象的引用,用这样的代码,不管你操作多少次result.add(sum);,最后你会发现,result里面的每一个list都是一样的数据。
List<Integer> sum = new ArrayList<Integer>();
List<List<Integer>> result = new ArrayList<List<Integer>>();
result.add(sum);
正确代码:
List<Integer> sum = new ArrayList<Integer>();
List<List<Integer>> result = new ArrayList<List<Integer>>();
result.add(new ArrayList<Integer>(sum));
完整代码:
class Solution {
List<List<Integer>>result = new ArrayList<List<Integer>>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<Integer>sum = new ArrayList<>();
dfs(root,sum,targetSum);
return result;
}
public void dfs(TreeNode root,List<Integer>sum,int target){
if(root == null)
return;
sum.add(root.val);
if(root.left == null && root.right == null){
if(target == root.val){
result.add(new ArrayList<>(sum));
sum.remove(sum.size()-1);
return;
}
else{
sum.remove(sum.size()-1);
return;
}
}
dfs(root.left,sum,target-root.val);
dfs(root.right,sum,target-root.val);
sum.remove(sum.size()-1);
}
}