#java #list #linked-list #double #deep-copy
#java #Список #связанный список #двойное #глубокое копирование
Вопрос:
У меня возникли некоторые проблемы при попытке создать глубокую копию двусвязного списка в моей программе Java.
Мой метод до сих пор:
открытый класс DblLinkQueue реализует очередь {
public Object clone() {
DblLinkQueue copy = null;
Node currNode, tmp = null;
try {
copy = (DblLinkQueue)super.clone();
} catch (CloneNotSupportedException err) {}
for (currNode = mHead.next; currNode.next != mHead; currNode = currNode.next) {
}
System.out.println("i: " i);
return copy;
}
}
mHead — первый узел в моем списке, и этот связанный список также является циклическим.
Что-то не так с моим циклом for, потому что он проходит через все элементы в списке, а затем бесконечно застревает на последнем элементе.
Любая помощь будет оценена!
Ответ №1:
Ваше условие завершения цикла заключается в том, что узел, предшествующий текущему узлу, не является головным. Я не уверен, почему у вас это есть, и я предполагаю, что именно поэтому вы застреваете. Не зная дизайна вашего класса Node, я бы предположил, что ваш next
член не выдает никаких исключений итерации, когда нет следующего узла, поэтому цикл будет продолжаться вечно ( null
узел никогда не будет иметь того же ссылочного значения, mHead
что и ).
Комментарии:
1. Упс, я на самом деле хотел скопировать «currNode.next != mHead» для моего состояния. Связанный список настраивается циклически, поэтому я решил, что, как только я пройду весь путь и вернусь к начальному узлу, он должен остановиться.
2. Ах, я бы не догадался об этом по имени класса. Тогда вы можете подумать о переименовании класса, чтобы указать, что это список с круговой связью.
Ответ №2:
Если бы я намеревался скопировать двусвязный список, я бы просто перебрал список, сделал копию каждого элемента и добавил его в новый список. Разработайте функции вставки / добавления и итерации, а затем функция копирования будет тривиальной.
Ответ №3:
Запустите текущий список и скопируйте каждый узел в новый список. В приведенном ниже списке замените «theCurrentQueue» на то, что вы используете для хранения текущей очереди.
public Object clone()
{
Node cloneNode;
DblLinkQueue returnValue = new DblLinkQueue();
for (Node currentNode : theCurrentQueue)
{
cloneNode = currentNode.clone(); // probabaly need to wrap this in a try catch block.
returnValue.add(cloneNode);
}
return returnValue;
}