【发布时间】:2015-11-04 22:56:56
【问题描述】:
我目前正在学习破解编码面试,我相信我对指针的基本理解受到质疑。我目前正在寻找一种解决方案,为二叉树的每一级制作一个链表。解决方法如下:
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, lists, 0) 之后,据我了解,列表不应该改变。
如果是 C++,如果他们将列表对象的指针传递给函数,我就能理解。
有人可以澄清一下吗?
抱歉格式化,我仍然不确定它在stackoverflow上是如何工作的。
谢谢
【问题讨论】:
-
Java、C++、C、C#、Python、Haskell、BF、JS、MipsAsm?
-
我实际上阅读了那篇文章,但我仍然需要澄清,据我了解,它声明列表不应该改变。我假设解决方案是用 Java 编写的。
-
Java 按值传递引用。 Java中作为值的“引用”与“按引用传递”的“引用”无关。 (这是一个不幸的命名冲突。)C++ 为“引用”引入了另一种含义。
-
passing an object (not a primitive) as a parameter into a function is passing the value of the reference, not the value itself?是的。将一个全新的对象分配给函数内部的变量名不会在外部做任何事情,但更改传递的对象会。
标签: java c++ pointers reference