我有一个HW分配,只有一个小部分的它是使一个拷贝构造函数,这使得它在你的参数已经进入链表的深度复制。
我明白,这意味着,你已经进入了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;我必须以某种方式沿着“拷贝”列表中移动?
这很难说是什么问题,没有看到为SortedLinkedSetNode
源,但你似乎与此语句修改您的原文:
copy.firstNode= copy.firstNode.next;
这可能推进firstNode你原来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;
}