LinkedList глубокое копирование java

#java #linked-list #clone

#java #связанный список #клонировать

Вопрос:

Я пытался выполнить глубокую копию моего связанного списка, известного как DictionaryNode то, что я сделал, но я не смог отобразить его содержимое в методе отображения, поскольку оно всегда равно null. почему DictinaryNode temp всегда имеет значение null ? и если я попытаюсь назначить temp = head, но с temp = copy этого не произойдет.

 public class ListOfNodes {

public class DictionaryNode {
    protected String word;
    private int level;
    private DictionaryNode next;
    private int space = 0;

    public void displayCopy() {
        DictionaryNode temp = copy.next;
        while( temp != null ) {
            System.out.println(temp.word)
                temp = temp.next;
        }
    }


    public DictionaryNode( String word, int level ) {
        this.word = word;
        this.level = level;
        next = null;
    }
}

private DictionaryNode head = null;
public DictionaryNode copy  = null;

//used to do deep copy
public void Clone() {
    DictionaryNode temp =  head.next;

    while( temp != null ) {
        copy = new DictionaryNode( temp.word , temp.level );
        copy  = copy.next;
        temp = temp.next;
    }
}

public void displayCopy() {
    DictionaryNode temp = copy.next;
    while( temp != null ) {
        Sytem.out.println(temp.word)
            temp = temp.next;
    }
}
  

Комментарии:

1. Вы никогда не присваиваете значение head . Кроме того, я думаю, что ваш метод clone должен возвращать ссылку на клонированный словарь.

2. head инициализируется с помощью чтения пользователем из файла, но проблема в том, что если я попытаюсь назначить временную ссылку head, она сработает и отобразит все содержимое, но если я попробую temp = copy, не сработает

3. Если это так, то опубликованный вами код — это не то, что вы на самом деле используете.

Ответ №1:

Эта программа продемонстрирует, как выполнить глубокое копирование списка. Он более общий, чем ваш конкретный пример, поэтому, надеюсь, он поможет и другим.

 public class Java_Practice {

private static class LinkedListTest {

    private String data;
    private LinkedListTest next;

    public LinkedListTest(String data) {
        super();
        this.data = data;
    }

    public String getData() {
        return data;
    }

    public LinkedListTest getNext() {
        return next;
    }

    public void setNext(LinkedListTest next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "LinkedListTest [data="   data   ", next="   next   "]";
    }

}

// Do a deep copy
private static LinkedListTest copyLlt(LinkedListTest original) {

    LinkedListTest copy = new LinkedListTest(original.getData()   " copied");

    LinkedListTest nextCopy = original.getNext();
    LinkedListTest current = copy;

    while (nextCopy != null) {

        LinkedListTest newCopy = new LinkedListTest(nextCopy.getData()   " copied");
        newCopy.setNext(nextCopy.getNext());

        current.setNext(newCopy);

        current = newCopy;
        nextCopy = newCopy.getNext();
    }

    return copy;
}

public static void main(String[] args) {

    LinkedListTest firstLlt = new LinkedListTest("First");
    LinkedListTest secondLlt = new LinkedListTest("Second");
    LinkedListTest thirdLlt = new LinkedListTest("Thrid");

    firstLlt.setNext(secondLlt);
    secondLlt.setNext(thirdLlt);

    LinkedListTest copiedLlt = copyLlt(firstLlt);

    // Data should say First, Second, Third
    System.out.println("Original LinkedListTest: "   firstLlt.toString());

    // Data should say First Copied, Second Copied, Third Copied
    System.out.println("Copied LinkedListTest: "   copiedLlt.toString());
}

}
  

Ответ №2:

В вашем Clone методе вы никогда не назначаете next поле для скопированного содержимого. Вам нужно сделать это, чтобы в копии было больше одного подключенного узла. Кроме того, вам также необходимо скопировать заголовок. Кроме того, do не должен перезаписываться copy ничем, кроме копии head:

 copy = new DictionaryNode(null, head.level);
DictionaryNode temp =  head.next;
DictionaryNode current = copy;

while( temp != null) {
    DictionaryNode nn = new DictionaryNode( temp.word , temp.level);
    current.next = nn;
    current = nn;
    temp = temp.next;
}
  

Комментарии:

1. но copy = new DictionaryNode(null, head. уровень); почему null вместо word?

2. @Anny: Разве заголовок не является просто элементом перед первым элементом? Я не знаю подробностей вашего списка. Если это не элемент перед первым элементом, а сам первый элемент, позаботьтесь о том, чтобы избежать NullPointerException . (и использовать head.word вместо null )