Как сделать копию двусвязного списка? - PullRequest
0 голосов
/ 24 марта 2011

У меня настоящие проблемы с этим; Я не знаю, как заставить этот код указывать назад на предыдущий узел. Я могу использовать только получить / установить Next и Previous. Это то, что я до сих пор:

public Doubly copyChildren(){
  Doubly newElement= this.getFirstChild().copyNode();
  Doubly current= this.getFirstChild();

  while (current.getNext!=null){
    newElement.setNext(current.copyNode());
    current=current.getNext();

  }
  return newElement;
}

может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Полагаю, вам нужна глубокая копия вашего двусвязного списка.

Doubly iterator = this.getFirstChild();
Doubly newList = iterator.copyNode();
Doubly newListTail = newList;

Doubly deepCurrNode = null
while ((iterator = iterator.getNext()) != null)
{
     deepCurrNode = iterator.copyNode();
     newListTail.setNext(deepCurrNode);
     deepCurrNode.setPrevious(newListTail);
     newListTail = deepCurrNode;
}
//just in case these aren't already null, I'll be explicit
newList.setPrevious(null);
newListTail.setNext(null); 
return newList;

EDIT:

Объяснение

код псевдо выглядит следующим образом:

while (more items, set iterator equal to next node)
{
   deepCurrNode <-- get deep copy of iterator (this is the item i want to add to my newList)
   Set the tail's next to deepCurrNode to link them
   Set deepCurrNode's previous to the tail to link backwards
   Set the Tail to point to the new tail of the list (deepCurrNode)      

}

0 голосов
/ 24 марта 2011

Вам необходимо выполнить итерации внутри списка (ов) и скопировать / клонировать каждый элемент в новый список (ы).

Проблема, с которой вы сталкиваетесь, заключается в том, что LinkedList хранит только внутренние ссылки на элементы, которыеэто содержит.Когда вы копируете список a в список b, вы действительно копируете ссылки из списка a в список b, поэтому любое изменение исходного списка отражается во вновь скопированном списке.

...