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

标签 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);
        }

最佳答案

重点是:

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

在第一个实现中,递归级别中的“前进指针”被遗忘了;家长来电者看不到职位已晋升。

如果你想让第一种方法起作用,你需要携带一个 Iterator/或让包含类包含某种 Iterator,这样在构建 LHS 时通过源列表的进展将被返回给 parent 并用于构建 RHS.. 在返回给祖 parent 之前,等等。

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

从本质上讲,您已经破解了一个解决方案——如果您将 W 设为迭代器,而不是您只是乱搞一个非结构化的东西,它将是干净和正确的。

关于java - 为什么在 Java 中创建包装器对象而不是传递本地引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16475027/

相关文章:

java - 将全局 gradle 安装与 Buildship 结合使用

Java NoClassDefFoundError

java - 我可以使用 React Native 的异步存储从本地存储中获取值吗?

java - 不同值的变量如何引用?

java - (Java) 将十进制数转换为具有设定位数的二进制数

java - 使用 setText 清除 TextField 的内容在 AWT 中不起作用

java - 使用 JDBC 的参数化查询

java - 在我们的相册中标记图像

java - 无法从文本文件中解密密文,对称 key 实现。在java中

java - 尽管在 Visual Studio 代码中链接了 java jar 文件,但仍然遇到链接器错误