下面是N叉树层次遍历的代码,为什么改变list时,也会将ans中对应的list改变?list = ans.get(depth)时,难道不是只是将ans中的list拷贝给了list吗
Java 数据类型分为基本数据类型和引用数据类型,list里面存的是引用数据类型
引用数据类型变量:在内存中存放的是地址(引用)
所以你修改list = ans.get(depth)是将ans中的list引用,给到你新创建的list(为了区分,下面改为newlist)
那么你修改了ans里面的list,也就是修改了内存中ans中的引用到的list,这个list又被newlist引用,那么newlist实际上也是被修改了
基本数据类型不受影响,但那是引用数据类型会这样
【以下回答由 ChatGPT 生成】
问题的原因是,List<Integer>
是一个引用类型,当你使用 ans.add(list)
将 list
添加到 ans
中时,实际上只是将 list
的引用添加进去了。所以当你修改 list
的时候,ans
中对应的 list
也会受到影响。
解决这个问题的方法是,在将 list
添加到 ans
之前,创建一个新的 ArrayList
并将 list
的元素复制进去。
下面是修改过的代码:
List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
Node node = queue.poll();
list.add(node.val);
for (Node child : node.children) {
queue.add(child);
}
}
ans.add(new ArrayList<>(list)); // 创建一个新的ArrayList并将list的元素复制进去
}
return ans;
}
通过将 list
复制到一个新的 ArrayList
中,就可以避免修改 list
影响到 ans
中的对应列表。