通过引用传递vs按值传递

时间:2015-11-04 22:56:56

标签: java c++ pointers reference

我目前正在学习Cracking the Coding的采访,我相信我对指针的基本理解受到质疑。我目前正在寻找一种解决方案,为二叉树的每个级别创建一个链表。解决方案如下:

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;
}

这个解决方案让我非常困惑,因为在只有root参数(驱动程序函数)的createLeveLinkedList函数中,会创建一个新的链接列表列表。从java的角度来看,如果按值传递,则在调用createLevelLinkedLists(root,lists,0)之后,根据我的理解,列表不应该更改。

如果它是C ++,我可以理解它是否将列表对象的指针传递给函数。

有人可以澄清一下吗?

对于格式化的抱歉,我仍然不确定它在stackoverflow上是如何工作的。

谢谢

1 个答案:

答案 0 :(得分:0)

Java总是按值传递。但是,为复杂数据类型传递的值是引用的值,因此传递到lists的{​​{1}}引用引用与原始createLevelLinkedList(...)引用相同的对象。

只要您不更改lists方法中的引用值,就会更改原始对象。

正如保罗所说,这一切都写在这里:

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