#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
)