Как глубоко скопировать двусвязный список в Java

#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;
}