下面是N叉树层次遍历的代码,为什么改变list时,也会将ans中对应的list改变?list = ans.get(depth)时,难道不是只是将ans中的list拷贝给了list吗

下面是N叉树层次遍历的代码,为什么改变list时,也会将ans中对应的list改变?list = ans.get(depth)时,难道不是只是将ans中的list拷贝给了list吗

img

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 中的对应列表。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^