我有一个硬件分配,其中只有一小部分是创建一个复制构造函数,该构造函数生成您在参数中输入的链接列表的深层副本。
我理解这意味着,您输入的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; 我必须以某种方式移动“复制”列表?
答案 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;
}