我必须为类创建一个链接列表数组,以便存储图形(邻接列表)。我们必须使用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;
}
}
答案 0 :(得分:0)
当我去为每一个添加第一个元素时,每个链表都会被更改,而不仅仅是数组索引处的那个
虽然您的代码段没有显示,但几乎肯定会出现别名问题。在几乎所有面向对象的语言中容易引起初学者的混叠问题是引用具有两个不同名称的相同对象的问题,即指向同一对象的两个不同变量。
现在您可能想知道:数组索引怎么样?问题是在一个数组索引处更改变量并在所有数组索引中进行更改,而不是一堆命名变量。但是,正如Eric Lippert explains(对于C#,它与Java非常相似),数组实际上是一组变量,您可以使用索引器表达式来引用它,而不必定义一堆单独的名称。从某种意义上说,int[] foo = new int[3]
就像声明foo0
,foo1
和foo2
一样,索引到foo
只是告诉编译器选择适当的变量。 foo0
,foo1
和foo2
。
如果您的阵列中确实有多个节点,您可能也想知道如何在多个Node
实例之间共享数据。有几种方法,如果没有Node
类的代码,知道哪些方法几乎是不可能的。正如@DNA指出的那样,Node
类中可能存在静态数据,这些数据会在所有实例中自动共享。 Node
对象也可能具有对基础数据的引用。如果将相同的引用传递给所有Node
构造函数,它们也会以这种方式对同一对象进行别名。
答案 1 :(得分:0)
您可能已将Node
内的某些内容声明为静态,因此每个实例都以相同的共享值结束,而不是拥有自己的值。但是,这只是一个猜测 - 请发布Node
的代码,以便我们可以看到问题到底是什么......