簡體   English   中英

Java中的鏈接列表數組

[英]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]就像聲明foo0foo1foo2 ,索引到foo只是告訴編譯器從foo0foo1foo2選擇適當的變量。

您可能還想知道,如果陣列中確實包含多個節點,那么如何在多個Node實例之間共享數據。 有幾種方法,要知道沒有Node類的代碼幾乎是不可能的。 正如@DNA指出的那樣, Node類中可能有靜態數據,這些數據會在所有實例之間自動共享。 Node對象也可以引用基礎數據。 如果將相同的引用傳遞給所有Node構造函數,則它們也都以這種方式為同一對象別名。

您可能已經在Node中將某些內容聲明為靜態的,因此每個實例最終都具有相同的共享值,而不是擁有自己的值。 但是,這只是一個猜測-請發布Node的代碼,以便我們可以真正了解問題所在...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM