Java中的链表数组

Java中的链表数组,java,arrays,linked-list,Java,Arrays,Linked List,为了存储图形邻接列表,我必须为一个类创建一个链表数组。我们必须使用Java。我可以创建数组并实例化每个链表,但当我将第一个元素添加到每个链表中时,每个链表都会发生更改,而不仅仅是数组索引处的链表 Node [] adjList; for(i=0;i<adjList.length;i++) adjList[i] = new Node(0,0,null); 或 编辑:这是节点类 import java.util.LinkedList; public class Node extend

为了存储图形邻接列表,我必须为一个类创建一个链表数组。我们必须使用Java。我可以创建数组并实例化每个链表,但当我将第一个元素添加到每个链表中时,每个链表都会发生更改,而不仅仅是数组索引处的链表

Node [] adjList;
for(i=0;i<adjList.length;i++)
    adjList[i] = new Node(0,0,null);

编辑:这是节点类

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;
    }
}
当我向每个链表添加第一个元素时,每个链表都会被更改,而不仅仅是数组索引处的链表

虽然您的代码片段没有显示它,但几乎可以肯定您存在别名问题。几乎所有面向对象语言的初学者都会遇到别名问题,这是指使用两个不同名称引用同一对象的问题,即两个不同变量指向同一对象

现在您可能想知道:数组索引呢?问题在于在一个数组索引处更改一个变量,并在所有数组索引中得到更改,而不是一组命名变量。但是,对于与Java非常相似的C,数组实际上是一组变量,您可以使用索引器表达式引用这些变量,而不必定义一组单独的名称。在某种意义上,int[]foo=new int[3]就像声明了foo0、foo1和foo2,而foo中的索引只是告诉编译器从foo0、foo1和foo2中选择适当的变量

如果您的阵列中确实有多个节点,您可能还想知道如何在多个节点实例之间共享数据。有几种方法,如果没有Node类的代码,知道哪种方法几乎是不可能的。正如@DNA所指出的,Node类中可能存在静态数据,这些数据在所有实例中自动共享。节点对象也可以有对底层数据的引用。如果将相同的引用传递到所有节点构造函数中,那么它们也会以这种方式对同一对象进行别名处理

当我向每个链表添加第一个元素时,每个链表都会被更改,而不仅仅是数组索引处的链表

虽然您的代码片段没有显示它,但几乎可以肯定您存在别名问题。几乎所有面向对象语言的初学者都会遇到别名问题,这是指使用两个不同名称引用同一对象的问题,即两个不同变量指向同一对象

现在您可能想知道:数组索引呢?问题在于在一个数组索引处更改一个变量,并在所有数组索引中得到更改,而不是一组命名变量。但是,对于与Java非常相似的C,数组实际上是一组变量,您可以使用索引器表达式引用这些变量,而不必定义一组单独的名称。在某种意义上,int[]foo=new int[3]就像声明了foo0、foo1和foo2,而foo中的索引只是告诉编译器从foo0、foo1和foo2中选择适当的变量


如果您的阵列中确实有多个节点,您可能还想知道如何在多个节点实例之间共享数据。有几种方法,如果没有Node类的代码,知道哪种方法几乎是不可能的。正如@DNA所指出的,Node类中可能存在静态数据,这些数据在所有实例中自动共享。节点对象也可以有对底层数据的引用。如果将相同的引用传递到所有节点构造函数中,它们也会以这种方式对同一对象进行别名处理。

您可能已将节点中的某个对象声明为静态,因此每个实例最终都具有相同的共享值,而不是具有自己的值。然而,这只是一个猜测-请发布节点的代码,这样我们就可以看到问题的真正所在…

您可能已经将节点中的某些内容声明为静态的,因此每个实例都以相同的共享值结束,而不是拥有自己的值。然而,这只是一个猜测-请发布Node的代码,这样我们就可以看到问题的真正所在…

这是家庭作业吗?我想我们需要节点的代码来帮助…发布节点的定义。为什么你的节点类要扩展LinkedList?这里没有is-a关系。在我看来,它就像一个空数组;更容易看到实际代码。您能显示进行打印的代码吗?另外,行adjList[i].addnewnodei+1,0,null;正在将一个节点添加到另一个节点。我以为每个节点都是一个整数链表。这是家庭作业吗?我想我们需要节点的代码来帮助…发布节点的定义。为什么你的节点类要扩展LinkedList?这里没有is-a关系。在我看来,它就像一个空数组;更容易看到实际代码。您能显示进行打印的代码吗?另外,行adjList[i].addnewnodei+1,0,null;正在将一个节点添加到另一个节点。我认为每个节点都是一个整数的链表。感谢所有的快速回答,我的头、下一个和数据都是静态的。我写得不多
谢谢你的快速回答,我的头,下一个和数据都是静态的。我不太会写java。
for(i=0;i<adjList.length;i++)
    adjList[i].add(new Node(i+1,0,null);
[3,0,null] // adjList[0]
[3,0,null] // adjList[1]
[3,0,null] // adjList[2]
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;
    }
}