簡體   English   中英

傳遞新的 ArrayList 與傳遞 ArrayList 作為函數(Java)中的參數

[英]Passing new ArrayList vs Passing ArrayList as a parameter in Function(Java)

請幫助我理解其中的區別。 就像在第一個代碼片段中一樣,我在第 1 行和第 2 行的遞歸 function 中將更新的 ArrayList 作為參數傳遞。這給了我錯誤的答案。

public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
        if(node == null)
            return;
        sub.add(node.val);
        if(node.left == null && node.right == null){
            list.add(sub);
            return;
        }
        rootToLeafPaths(node.left,sub); //LINE 1
        rootToLeafPaths(node.right,sub); //LINE 2
        sub.remove(sub.size()-1);    
    }

在第二個代碼片段中,我傳遞了一個新創建的 ArrayList(在第 3 行和第 4 行),它給了我正確的答案。

public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
            if(node == null)
                return;
            sub.add(node.val);
            if(node.left == null && node.right == null){
                list.add(sub);
                return;
            }
            rootToLeafPaths(node.left,new ArrayList<Integer> (sub)); // LINE 3
            rootToLeafPaths(node.right,new ArrayList<Integer> (sub)); // LINE 4
            sub.remove(sub.size()-1);    
    }

幫助我理解其中的區別。

該方法應該提供二叉樹的根到葉路徑。 就像在第一種情況下,它給我 [[1, 2, 4], [1, 2, 4], [1, 2, 4]] 作為 output 這是錯誤的,但是當我通過一個新創建的 ArrayList 時它給我 [[1, 2, 4, 6, 8], [1, 2, 5, 7, 9, 10], [1, 3]] 作為 output 的時間是正確的

list.add(sub)中,您將sub List添加為list List的一個元素。

在您的第一個片段中, sub始終引用相同的List ,這意味着您的 output list將包含對同一List的多個引用。 因此錯誤的答案。

在您的第二個片段中,您為每個遞歸調用創建sub的副本,這意味着您將不同的List實例添加到您的list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM