2017-05-30 134 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

相關問題