Массив связанных списков в Java - PullRequest
2 голосов
/ 12 марта 2012

Мне нужно создать массив связанных списков для класса, чтобы сохранить график (список смежности).Мы должны использовать 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]

edit: вот класс 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Вы, вероятно, объявили что-то в Node как статическое, поэтому каждый экземпляр заканчивается одним и тем же общим значением, а не имеет своего собственного значения. Тем не менее, это всего лишь предположение - пожалуйста, отправьте код Node, чтобы мы могли увидеть, в чем проблема на самом деле ...

0 голосов
/ 12 марта 2012

когда я добавляю первые элементы к каждому, меняется каждый связанный список, а не только один в индексе массива

Хотя ваш фрагмент кода непокажите это, почти наверняка у вас есть проблема с алиасами.Проблема псевдонимов, которая имеет тенденцию кусать новичков почти во всех объектно-ориентированных языках, заключается в том, чтобы ссылаться на один и тот же объект с двумя разными именами, т.е. двумя разными переменными, указывающими на один и тот же объект.

Теперь вы можетеинтересно: а как насчет индексов массива?Проблема заключается в изменении переменной для одного индекса массива и получении изменений для всех индексов массива , а не для группы именованных переменных.Но, как объясняет Эрик Липперт (для C #, который очень похож на Java), массив на самом деле представляет собой набор переменных, на которые можно ссылаться с помощью выражения индексатора, вместо того, чтобы определять группу отдельныхимена.В некотором смысле, int[] foo = new int[3] походит на объявление foo0, foo1 и foo2, а индексирование в foo просто говорит компилятору выбрать соответствующую переменную из foo0, foo1 и foo2.

Вам также может быть интересно, как данные могут совместно использоваться несколькими экземплярами Node, если в вашем массиве действительно есть несколько узлов.Есть несколько способов, и знать, что практически невозможно без кода для класса Node.Как указывает @DNA, в классе Node могут быть статические данные, которые автоматически передаются всем экземплярам.Объект Node также может иметь ссылку на базовые данные.Если вы передадите одну и ту же ссылку во все конструкторы Node, все они также будут использовать псевдонимы для одного и того же объекта.

...