如何在Java中深层复制双向链表

时间:2011-10-06 21:07:18

标签: java list linked-list double deep-copy

在尝试在我的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循环有问题,因为它遍历列表中的所有元素,然后无限地卡在最后一个元素上。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

您的循环结束条件是当前节点之前的节点不是头部。我不确定你为什么会在那里,我猜这就是你被卡住的原因。在不知道Node类的设计的情况下,我猜你的next成员在没有后续节点的情况下不会抛出任何类型的迭代异常,因此循环将永远存在(null节点永远不会有与mHead相同的参考价值。

答案 1 :(得分:0)

如果我打算复制双向链表,我只需遍历列表,复制每个项目,然后将其附加到新列表中。计算插入/追加和迭代函数,然后复制函数是微不足道的。

答案 2 :(得分:0)

运行当前列表并将每个节点复制到新列表。在下面的列表中,将“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;
}