Как глубоко скопировать двусвязный список в Java - PullRequest
0 голосов
/ 07 октября 2011

У меня было немало трудностей при попытке сделать глубокую копию двусвязного списка в моей 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 - первый узел в моем списке, и этот связанный список также является круглым.

Что-то не так с циклом my for, потому чтоон проходит через все элементы в списке, а затем бесконечно застревает на последнем элементе.

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Условием окончания цикла является то, что узел до текущего узла не является заголовком. Я не уверен, почему у вас это есть, и я предполагаю, что именно поэтому вы застряли. Не зная дизайна вашего класса Node, я бы предположил, что ваш next член не генерирует никаких исключений итерации, когда нет следующего узла, поэтому цикл будет идти вечно (null Node никогда не будет иметь то же значение ссылки, что и mHead).

0 голосов
/ 07 октября 2011

Запустить текущий список и скопировать каждый узел в новый список.В приведенном ниже списке замените «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;
}
0 голосов
/ 07 октября 2011

Если бы я собирался скопировать двусвязный список, я бы просто перебрал список, сделал копию каждого элемента и добавил его в новый список. Разработайте функции вставки / добавления и итерации, и тогда функция копирования будет тривиальной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...