[英]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.