问题概述
最近在做Leetcode中一道二叉树算法题 [二叉树中和为某一值的路径] 时遇到了一个小问题,result是符合条件的结果集,list是所有路径和的待选结果集,当判定list中存储的待选结果符合条件,准备存入result时我直接使用的result.add(list);
而没有考虑深浅拷贝的问题,导致后续回溯剪枝操作造成result集错误。
深浅拷贝语法
result.add(list);
属于浅拷贝,当添加一个list后,如果list改变,result值也会随之发生变化,尤其注意之前已经存进去的lsit会变;
result.add(new ArrayList<Integer>(list));
属于深拷贝,当添加一个list后,如果list改变,result之前存储的值不会发生变化;
所以这道算法题如果直接使用浅拷贝添加list,那么当回溯到上一个节点,也就是删除掉list的最后一个节点时,已经存储在待选结果中的 list 中的某条路径和也会发生改变。
代码测试
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list); //[1, 2, 3]
/**
* 浅拷贝中,当添加一个list后,如果list改变,result值也会随之发生变化,尤其注意之前已经存进去的lsit会变;
*/
result.add(list); //浅拷贝
System.out.println(result); //[[1, 2, 3]]
list.add(4);
result.add(list);
System.out.println(result); //[[1, 2, 3, 4], [1, 2, 3, 4]]
//清空列表
list.clear();
result.clear();
System.out.println(list);
System.out.println(result);
/**
* 深拷贝中,当添加一个list后,如果list改变,result之前存储的值不会发生变化;
*/
result.add(new ArrayList<Integer>(list)); //深拷贝
System.out.println(result); //[[]]
list.add(4);
result.add(list);
System.out.println(result); //[[], [4]]
}