为什么创建包装器对象在Java中工作而不是传递本地引用?

时间:2013-05-10 04:06:03

标签: java

我在Java中查看此代码,将已排序的链接列表转换为平衡的BST,我想知道为什么实现#1不起作用。什么是Java的原因,当我创建一个包装器对象并传递它然后它完美的工作,但当我使用本地引用它不?仍然在堆右侧创建对象。

实施#1

BinaryTree.Node sortedListToBST(MyList.Node w, int start, int end) 
    {
          if (start > end) return null;
          int mid = start + (end - start) / 2;
          BinaryTree.Node left = sortedListToBST(w, start, mid-1);
          BinaryTree.Node parent = new BinaryTree.Node(w.getVal());
          w = w.getNext();
          BinaryTree.Node right = sortedListToBST(w, mid+1, end);
          parent.left = left;
          parent.right =right;
          return parent;
        }



        BinaryTree.Node sortedListToBST(MyList.Node head, int n) {

          return sortedListToBST(head, 0, n-1);
        }

实施#2

    BinaryTree.Node sortedListToBSTWrapper(Wrapper w, int start, int end) 
    {
          if (start > end) return null;
          int mid = start + (end - start) / 2;
          BinaryTree.Node left = sortedListToBSTWrapper(w, start, mid-1);
          BinaryTree.Node parent = new BinaryTree.Node(w.node.getVal());
          w.node = w.node.getNext();
          BinaryTree.Node right = sortedListToBSTWrapper(w, mid+1, end);
          parent.left = left;
          parent.right =right;
          return parent;
        }



        BinaryTree.Node sortedListToBSTWrapper(MyList.Node head, int n) {
             Wrapper w = new Wrapper();
                w.node = head;
          return sortedListToBSTWrapper(w, 0, n-1);
        }

1 个答案:

答案 0 :(得分:4)

关键是:

w.node = w.node.getNext();

在第一个实现中,忘记了递归级别中的“前进指针”;父母来电者看不到先进的位置。

如果你想让第一个方法工作,你需要随身携带Iterator /或让包含类包含某种类型的迭代器,以便在构建LHS时通过源列表前进给父母和用于建立RHS ..然后返回祖父母等等。

如果语言具有多值返回,则可以返回(BinaryTree.Node,MyList.Node)并使用该元组中的第二个字段来跟踪您的工作进度。

基本上,你已经破解了一个解决方案 - 它将是干净的&如果你使W成为迭代器,那么就更正确了,而不是你想要的非结构化的东西。