繁体   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