Глубокая копия линейного связанного списка - PullRequest
0 голосов
/ 14 января 2011

У меня есть линейный связанный список, состоящий из узлов:

class Node{
    Object data;
    Node link;

    public Node(Object pData, Node pLink){
        this.data = pData;
        this.link = pLink;
    }

    public String toString(){
        if(this.link != null){
            return this.data.toString() + this.link.toString();
        }else{
            return this.data.toString() ;
        }
    }

    public void inc(){
        this.data = new Integer((Integer)this.data + 1);
    }

    public Node copy(){
        return new Node(this.data, this.link.copy());
    }
}

Я хочу сделать глубокую копию списка. Затем увеличьте каждый узел исходного списка и выведите оба. Я не знаю, если код правильный.

class Aufg1{
    public static void main(String args[]){
        Node node3 = new Node(new Integer(3), null);            
        Node node2 = new Node(new Integer(2), node3);           
        Node node1 = new Node(new Integer(1), node2);
        System.out.println(node1.copy().toString());
        System.out.println(node1.toString());
    }
}

... дает мне всего 123 за второй вывод, но что-то не так с копией Есть идеи?

Обновление:

   public Node copy(){
        if(this.link != null){
            return new Node(new Integer((Integer)this.data), this.link.copy());
        }else{
            return new Node(new Integer((Integer)this.data), null);
        }
    }

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Глубокая копия подразумевает, что вам также необходимо сделать копию данных.

 public Node copy(){
    return new Node(copy of this.data, this.link.copy());
 }

Поэтому вам необходимо решить, как вы собираетесь копировать объект.

РЕДАКТИРОВАТЬ:Вы можете использовать что-то вроде библиотеки глубокого клонирования , чтобы помочь.Они используют отражение и т. Д. Если вы знаете тип объектов, в котором вы сами создаете класс объектов, вы можете создать конструктор копирования.

1 голос
/ 14 января 2011

Что ж, судя по тому, что ссылка может быть нулевой, вы можете не вызывать this.link.copy () без предварительной проверки.Я предполагаю, что проблема, о которой вы говорите, это исключение нулевого указателя.

РЕДАКТИРОВАТЬ:

Да, и то, что сказал Винсент.:)

Обязательно скопируйте и объект.

...