Java中链表的深度复制构造函数

Java中链表的深度复制构造函数,java,linked-list,copy-constructor,deep-copy,copying,Java,Linked List,Copy Constructor,Deep Copy,Copying,我有一个HW赋值,其中只有一小部分是创建一个复制构造函数,它创建一个链接列表的深度副本,您已经在其参数中输入了链接列表 我理解这意味着,您输入的列表保持不变,并且新链接列表与“旧”链接列表隔离。我的代码为我提供了一个新列表,它与旧列表(作为参数输入的列表)完全相同,这是我想要的,但旧列表已更改 以下是构造函数: public SortedLinkedSet(SortedLinkedSet<T> copy) { if (copy == null) { this.

我有一个HW赋值,其中只有一小部分是创建一个复制构造函数,它创建一个链接列表的深度副本,您已经在其参数中输入了链接列表

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

以下是构造函数:

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
        }
    }      
}
这非常有效(但我事先知道我只使用3个元素列表进行测试)。如果不使用以下语句,我如何使用while循环进行测试: copy.firstNode=copy.firstNode.next;
我必须以某种方式沿着“复制”列表移动?

如果不查看
SortedLinkedSetNode
的源代码,很难说问题出在哪里,但您似乎正在用以下语句修改您的原始内容:

copy.firstNode=copy.firstNode.next

这可能会将firstNode提前到原始linkedset的末尾,从而导致原始linkedset只有一个元素。此外,令人困惑的是,原文被称为“副本”。您可能希望重命名它,以便更好地理解代码

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

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

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;
 }

这可能有助于您理解这个概念:您是对的,我刚刚做了一个测试,删除了这个语句和while循环,然后又添加了3个“添加”语句,第一次调用copy.getfirstNode.value,第二次调用copy.getfirstNode.next.value,最后是copy.getfirstNode.next.next.value,它可以工作(但我知道我只使用3个元素的列表进行测试)。当我尝试在循环中进行测试(“while”,因为我不知道长度)时,我不知道如何不使用这样的语句。感谢您指出这一点!使用临时变量存储对列表中当前节点的引用,并更新该变量,而不是原始变量。请参阅我更新的答案。
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;
 }