我发现在这件事上的混淆通常归结为不了解对象是如何在 Java 中传递的。
使用如下代码所示的 updateNodeData,您将按值传递引用的副本作为第一个参数。然后将修改该节点的数据(假设数据是public)。
类似地,nodeToBeChanged 的 leftNode 现在也将引用与传入 newLeftNode 相同的节点。不会克隆/创建具有复制值的新节点。
public void updateNodeData(Node node, int newValue){
node.data = newValue;
}
public void setLeftNode(Node nodeToBeChanged, Node newLeftNode)
{
nodeToBeChanged.leftNode = newLeftNode;
}
然而,经常令人困惑的是,因为它是按值传递的引用的副本,所以您不能像下面演示的那样交换两个节点。您将交换副本而不是实际参考。
public void swap(Node node1, Node node2)
{
Node tmpNode = node1;
arg1 = arg2;
arg2 = tmpNode;
}
现在回到最初的问题。如果要使用像这样的节点来实现节点树:
public class Node {
private int data;
private Node left;
private Node right;
...
}
不会有同一个节点的不同克隆在整个地方浪费内存。它只是一长串节点和引用。