[英]Array of Linked Lists in Java
我必須為一個類創建一個鏈接列表數組,以便存儲圖形(鄰接列表)。 我們必須使用Java。 我可以創建數組並實例化每個鏈表,但是當我向每個鏈表添加第一個元素時, 每個鏈表都會改變,而不僅僅是數組索引處的鏈表。
Node [] adjList;
for(i=0;i<adjList.length;i++)
adjList[i] = new Node(0,0,null);
這將實例化每個新的鏈接列表[ Node
是我自己的類,帶有構造函數Node(int head, int data, Node next
)並擴展LinkedList
]
然后我去添加第一個值到每個節點:
for(i=0;i<adjList.length;i++)
adjList[i].setHead(i+1); // numbers 1 to end are the graph vertices
要么
for(i=0;i<adjList.length;i++)
adjList[i].add(new Node(i+1,0,null);
在這些循環的最后,我使用print語句調試代碼。我打印出每個鏈表,但對於每個鏈表,值都是最后一個
即。 如果adjList.length = 2
,它將打印出
[3,0,null] // adjList[0]
[3,0,null] // adjList[1]
[3,0,null] // adjList[2]
編輯:這是Node類
import java.util.LinkedList;
public class Node extends LinkedList{
private static int head;
private static int data;
private static Node next;
public Node(int h,int d,Node n) {
head = h;
data = d;
next = n;
}
public int getHead(){ // getNext() and getData() are the same
return head;
}
public void setHead(int h){ // setNext() and setData() are basically the same
head = h;
}
}
當我將第一個元素添加到每個元素時,每個鏈接列表都會更改,而不僅僅是數組索引處的元素
盡管您的代碼段未顯示該代碼段,但幾乎可以肯定您有一個別名問題。 別名問題幾乎在所有面向對象的語言中都容易引起初學者的注意,它是用兩個不同的名稱(即兩個指向相同對象的變量)來引用同一對象的問題。
現在您可能想知道:數組索引呢? 問題在於更改一個數組索引處的變量並獲得所有數組索引處的變化 ,而不是一堆命名變量。 但是,正如Eric Lippert解釋的那樣 (對於C#,它與Java非常相似),數組實際上是一堆變量,您可以使用索引器表達式來引用它,而不必定義一堆單獨的名稱。 從某種意義上說, int[] foo = new int[3]
就像聲明foo0
, foo1
和foo2
,索引到foo
只是告訴編譯器從foo0
, foo1
和foo2
選擇適當的變量。
您可能還想知道,如果陣列中確實包含多個節點,那么如何在多個Node
實例之間共享數據。 有幾種方法,要知道沒有Node
類的代碼幾乎是不可能的。 正如@DNA指出的那樣, Node
類中可能有靜態數據,這些數據會在所有實例之間自動共享。 Node
對象也可以引用基礎數據。 如果將相同的引用傳遞給所有Node
構造函數,則它們也都以這種方式為同一對象別名。
您可能已經在Node
中將某些內容聲明為靜態的,因此每個實例最終都具有相同的共享值,而不是擁有自己的值。 但是,這只是一個猜測-請發布Node
的代碼,以便我們可以真正了解問題所在...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.