2014-03-02 65 views
0

我有一个HW分配,只有一小部分是制作一个复制构造函数,该构造函数会对您在其参数中输入的链接列表进行深层复制。用于Java中的链接列表的深度复制构造函数

据我所知,这意味着您输入的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

这可以帮助你理解这个概念:http://stackoverflow.com/questions/6182565/java-deep-copy-shallow-copy-clone –

回答

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

你说得对,我只是做了测试我删除了这个语句和while循环,并且在第一次调用copy.getfirstNode.value时添加了3个“添加”语句,并且在下一个copy.getFirstNode.next.value中,最后添加了copy.getFirstNode.next .next.value 它工作(但我知道即时测试只有一个3元素列表)。当我尝试做一个循环(“虽然”,因为我不知道长度)我不能看到如何不使用这样的声明。感谢您指出! – user3371034

+0

使用临时变量来存储对列表中当前节点的引用,并更新该变量而不是原来的。看到我更新的答案。 – lreeder