【问题标题】:Array of Linked Lists in JavaJava中的链表数组
【发布时间】:2012-03-11 21:42:20
【问题描述】:

为了存储图形(邻接表),我必须为一个类创建一个链表数组。我们必须使用 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);

我使用打印语句来调试代码 在这些循环结束时,我打印出每个链接列表,但对于每个链接列表,值都是最后一个

即。如果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;
    }
}

【问题讨论】:

  • 这是作业吗?我想我们需要Node 的代码来帮助...
  • 贴出Node的定义。
  • 为什么你的Node 类扩展LinkedList?这里没有 is-a 关系。
  • 对我来说看起来像一个空数组;更容易看到实际代码。
  • 你能显示打印的代码吗?此外,adjList[i].add(new Node(i+1,0,null); 行将Node 添加到另一个Node。我以为每个Node 都是一个整数链表。

标签: java arrays linked-list


【解决方案1】:

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

【讨论】:

  • 感谢所有快速回答,我确实有 head、next 和静态数据。我不会写太多java。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多