簡體   English   中英

通過引用與通過值傳遞

[英]Passing by reference vs Passing by value

我目前正在學習《破解編碼》采訪,我相信我對指針的基本理解受到質疑。 我目前正在尋找一種為二叉樹的每個級別制作一個鏈表的解決方案。 解決方法如下:

void createLevelLinkedList(TreeNode root, ArrayList<LinkedList<TreeNode» lists, int level) {
    if (root == null) return; // base case
    LinkedList<TreeNode> list = null;
    if (lists.size() == level) { // Level not contained in list
        list = new LinkedList<TreeNode>();
        /* Levels are always traversed in order. So., if this is the
         * first time we've visited level i, we must have seen levels
         * 0 through i - 1. We can therefore safely add the level at
         * the end. */
        lists.add(list);
    } else {
        list = lists.get(level);
    }
    list.add(root);
    createLevelLinkedList(root.left, lists, level + 1);
    createLevelLinkedList(root.right, lists, level + 1);
}

ArrayList<LinkedList<TreeNode» createLevelLinkedList(TreeNode root) {
    ArrayList<LinkedList<TreeNode» lists = new ArrayList<LinkedList<TreeNode»();
    createLevelLinkedList(root, lists, 0);
    return lists;
}

該解決方案使我感到非常困惑,因為在僅具有根參數(驅動程序函數)的createLeveLinkedList函數中,將創建一個新的鏈表列表。 從Java的角度來看,如果按值傳遞它,則在調用createLevelLinkedLists(root,list,0)后,據我所知,列表應該沒有改變。

如果是C ++,如果他們將lists對象的指針傳遞給函數,則我可以理解。

有人可以澄清一下嗎?

抱歉的格式,我仍然不確定它如何在stackoverflow上工作。

謝謝

Java總是按值傳遞。 然而通過對復雜數據類型的值是基准,所以lists參考送入createLevelLinkedList(...)是指相同的對象的原始lists參考。

只要您不更改createLevelLinkedList(...)方法中引用的值,就可以更改原始對象。

正如Paul所提到的,所有內容都記錄在這里:

https://stackoverflow.com/a/40523/1619628

暫無
暫無

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

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