2017-05-30 86 views
2

所以我有一个名为“SNode s”的节点阵列(它们是我自己创建的一个类,它们实际上只是一个基本节点,它包含一个字符串和一个指向下一个节点的指针)。如何使用变量创建对我的对象的引用?

我有一个方法叫做insertValue(),它接受你想要放入一个值的索引和你想要SNode包含的字符串。但是,如果通过的索引已包含SNode,我希望新值成为SNode的“下一个”节点(实质上是在每个索引空间中创建一个链接的节点列表)。

private int insertValue(int arrayPos, String element){//Checks for collisions with another SNode, and inserts the SNode into the apppropriate spot in the array 
SNode targetNode = array[arrayPos];//What I want to be a reference to the node at the desired position in the array 

while (targetNode != null){//If an SNode already exists in that position, keeps iterating down until it gets to a non-existant SNode. 
    targetNode = targetNode.getNext();//getNext is a method in my SNode that just returns a reference to that SNode's "nextNode" variable. 
} 
    targetNode = new SNode(element); 
    return arrayPos; 
}//end insertValue 

我的问题是我运行此方法后,它不会创建所需的排列位置的新节点,甚至当阵列点为空第一次运行。

如果我改变targetNode = new SNode(element);array[arrayPos] = new SNode(element);这显然插入SNode入阵就好了,这样使我相信所发生的事情是新SNode正处于变量targetNode创建的,但targetNode没有链接到实例化后的数组位置。我假设它基本上是将数据从第2行的数组位置复制到变量中,但随后变成了它自己的独立实体。

那么我怎么有targetNode实际参考和影响SNode? (当我重复上下贯通的节点在已经占据阵列空间链表这样的方式,targetNode指向正确的

注:为了简单起见,我已经离开了在SNode中使用setNext()方法的行将链接列表中的前一个节点链接到其下一个节点。

回答

1

你有一个误解。变量和数组元素都不包含对象。他们将引用对象。此外,变量和数组位置本身不是对象,因此Java中没有办法引用它。最接近你可以得到的是你的变量或数组位置包含的值的副本(对对象的引用)。

因此,本...

SNode targetNode = array[arrayPos]; 

...副本array[arrayPos]值入变量targetNode。如果该值不是null,则后面的变量引用与数组元素相同的对象,但该对象本身不会被复制。这很好,并正是你想要在这种情况下什么,当你走路

targetNode = targetNode.getNext(); 

链表,你不想修改array[arrayPos]或任何节点的next refernces的,因为那时你会失去链接列表的元素。

但是你不能两面都有。当你最终找到新SNode的位置,并执行这个...

targetNode = new SNode(element); 

...它没有参考记录的新SNode无论它是你最近拷贝targetNode的从价值。它只是在targetNode中提供参考。

你想要做的是找到最后一个当前节点(如果有的话),并分配给它的next引用(如果最初是null,则直接指向数组元素)。

+0

啊哈!好吧,所以*初始*时间我需要一个'if'语句来检查数组索引是否为空。如果是这样,我需要直接编辑数组索引来添加新的SNode.但在此之后,我可以使用'targetNode'指向它后面的链表对象,并且它将正常工作。谢谢,这完全解决了我的问题! – Guy

1

这里targetNode涉及array[arrayPos]引用的对象。

SNode targetNode = array[arrayPos];//What I want to be a reference to the node at the desired position in the array 

但是当你写:

targetNode = targetNode.getNext();//getNext is a method in my SNode that just 

你改变由targetNode变量引用的对象。现在它指的是它的下一个节点。

然后,当你这样做:

targetNode = new SNode(element); 

您创建一个新的对象,并将其分配给targetNode变量,但最后却是从来没有关联到现有的节点。

它不会为下一个节点分配一个新节点。
要做到这一点,你可以写:

targetNode.setNext(new SNode(element)); 
+0

是的,但即使数组点在第一次运行时也是空的(因此它跳过while循环,因为'targetNode == null'),它不会在那里放置一个新节点。但是,谢谢你指出这可能会让人困惑,我会编辑这个问题。 – Guy

+0

不客气。它不起作用的原因是我已经解释过:'targetNode = new SNode(element);'创建一个新对象并将其分配给'targetNode'变量。但它意味着'targetNode'变量不再引用'array [arrayPos]'。所以它对'array [arrayPos]'没有影响。 – davidxxx

+0

是的,那正是我的问题。那么我该如何拥有'targetNode'引用'array [arrayPos]'? – Guy

相关问题