深拷贝构造函数在Java链表

问题描述 投票:0回答:1

我有一个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;我必须以某种方式沿着“拷贝”列表中移动?

java linked-list copy-constructor deep-copy copying
1个回答
0
投票

这很难说是什么问题,没有看到为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;
 }
© www.soinside.com 2019 - 2024. All rights reserved.