我目前正在学习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上是如何工作的。
谢谢
答案 0 :(得分:0)
Java总是按值传递。但是,为复杂数据类型传递的值是引用的值,因此传递到lists
的{{1}}引用引用与原始createLevelLinkedList(...)
引用相同的对象。
只要您不更改lists
方法中的引用值,就会更改原始对象。
正如保罗所说,这一切都写在这里: