Java中链表的深度复制构造函数
我有一个HW赋值,其中只有一小部分是创建一个复制构造函数,它创建一个链接列表的深度副本,您已经在其参数中输入了链接列表 我理解这意味着,您输入的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.
列表保持不变,并且新链接列表与“旧”链接列表隔离。我的代码为我提供了一个新列表,它与旧列表(作为参数输入的列表)完全相同,这是我想要的,但旧列表已更改
以下是构造函数:
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;
}