Java中链接列表的深层复制构造函数

时间:2014-03-02 15:53:14

标签: java linked-list copy-constructor deep-copy copying

我有一个硬件分配,其中只有一小部分是创建一个复制构造函数,该构造函数生成您在参数中输入的链接列表的深层副本。

我理解这意味着,您输入的List保持不变,并且新链接列表与“旧”链接列表隔离。我的代码给了我一个新的列表,它与旧的列表(你作为参数输入的那个)完全相同,这就是我想要的,但旧的列表已被更改。

这是构造函数:

public SortedLinkedSet(SortedLinkedSet<T> copy) {
    if (copy == null) {
        this.firstNode = null;
    } else{
        SortedLinkedSetNode firstNode1 = new SortedLinkedSetNode(copy.getFirstNode().value);
        this.firstNode = firstNode1;
       // so basically I am chaining elements from "copy" to firstNode1 and then making "this" = to firstNode1. 
        while (copy.firstNode.next !=null) {  
            firstNode1.add(copy.getFirstNode().next.value);
            this.firstNode = firstNode1;
            copy.firstNode = copy.firstNode.next;
       // at the end of this loop I have a successful new linkedList with the same value, but "copy" has been changed
        }
    }      
}

例如,如果我输入一个具有值(1,2,3)的链接列表 - 使用此构造函数我会返回一个值为1,2,3的新链接列表,但旧的链接列表只有1 ..如果有人可以帮助我解决为什么这会出错,这将是伟大的。感谢

更新:正如Ireeder所指出的,并且通过测试,我几乎可以肯定问题出在声明中:     copy.firstNode = copy.firstNode.next; 我删除了当前的代码,并进行了以下测试:

SortedLinkedSetNode firstNode = new SortedLinkedSetNode(copy.getFirstNode().value);
this.firstNode=firstNode;

firstNode.add(copy.getFirstNode().next.value);
this.firstNode = firstNode;

firstNode.add(copy.getFirstNode().next.next.value);
this.firstNode = firstNode;

并且这完美地工作(但我事先知道我只用3个元素列表进行测试)。如何使用while循环而不使用如下语句:      copy.firstNode = copy.firstNode.next; 我必须以某种方式移动“复制”列表?

1 个答案:

答案 0 :(得分:0)

如果没有看到SortedLinkedSetNode的来源,很难说出问题是什么,但是您似乎正在使用此声明修改原文:

copy.firstNode= copy.firstNode.next;

这可能会将firstNode推进到原始链接集的末尾,从而导致原始元素具有一个元素。此外,令人困惑的是原件被称为“复制”。您可能需要重命名它,以便更好地理解您的代码。

创建深层副本时,不应修改要复制的结构。

在这种情况下,您可以使用临时变量来存储对您当前节点的引用,而无需修改原始数据结构。试试这个:

this.firstNode = firstNode1;
// so basically I am chaining elements from "copy" to firstNode1 and then making "this" = to firstNode1. 

SortedLinkedSetNode currentNode = copy.firstNode;

while (currentNode.next !=null) {  
    firstNode1.add(currentNode.next.value);
    this.firstNode = firstNode1;
    currentNode = currentNode.next;
 }
相关问题