有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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]

编辑:这是节点类

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;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    when I go to add the first elements to each one, every linked list gets changed, not just the one at the index of the array

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

    现在你可能想知道:数组索引呢?问题在于在一个数组索引处更改一个变量,并在所有数组索引中得到更改,而不是一组命名变量。但是,正如Eric Lippert explains(对于C#,它与Java非常类似),数组实际上是一组变量,可以通过索引器表达式引用,而不必定义一组单独的名称。从某种意义上说,int[] foo = new int[3]就像声明foo0foo1foo2,索引到foo只是告诉编译器从foo0foo1foo2中选择合适的变量

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

  2. # 2 楼答案

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