【问题标题】:How to deep copy a Doubly Linked List in Java如何在 Java 中深度复制双向链表
【发布时间】:2011-12-02 14:06:09
【问题描述】:

尝试在我的 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 是我列表中的第一个 Node,这个链表也是循环的。

我的 for 循环出了点问题,因为它遍历列表中的所有元素,然后无限卡在最后一个元素上。

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果我打算复制一个双向链表,我只需遍历该列表,复制每个项目,并将其附加到一个新列表中。算出插入/追加和迭代函数,然后复制函数就很简单了。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 哎呀,我实际上是想根据我的情况复制“currNode.next!= mHead”。链接列表是以循环方式设置的,所以我认为一旦我一直循环并回到开始节点,它应该停止。
        • 啊——我不会从类名中猜到这一点。然后,您可能需要考虑重命名该类以表明它是一个循环链表。
        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 2017-04-09
        • 2011-07-25
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多