2016-03-30 150 views
0

我使用几乎所有的递归函数创建一个链表,并且我迷上了复制构造函数。链表有一个头部和一个尾部虚拟节点。我有:递归复制链接列表

/* Recursively duplicates the list. */ 
void duplicateNodes(const SortedList& o, Node * const copyIter) { 

    if (copyIter != head) { 
     duplicateNodes(o, copyIter->previous); 
    } 

    tail = tail->next = createNode(tail, copyIter->data, nullptr); 
    size = o.size; 

} 

我的拷贝构造函数:

SortedList(const SortedList& o) { 
    duplicateNodes(o, o.tail); 
} 

提前感谢!我还没完全理解递归。

+0

如果'head'和'tail'是'SortedList'的私有成员,我建议使用'_tail'或'm_tail'等前缀表示法。 – Dagrooms

+0

或者总是用this-> tail来表示它。另外我讨厌人们在同一条线上使用两个作业,阅读和跟随是很可怕的。 –

+0

顺便说一句,在我看来,你在这里得到的是一个无止境的循环,只是自己反复调用自己。你的第一个if语句可能是真的,你的递归将继续调用duplicateNodes –

回答

0

我要描述答案,但我会留下编码给你,因为它看起来像功课,你可能应该自己做。我希望那些被允许的权力。递归应该总是有停止条件,最好将它放在函数的开头。递归函数duplicateNodes不需要整个列表o,只是它的头部。 它需要做的事情是基本遍历o的节点并在我们的列表中创建一个相应的节点,因此duplicateNodes将使用nodeBeingCopied-> next调用它自己。停止条件显然是nodeBeingCopied == null(尽管nodeBeingCopied-> next == null也可以在函数结束时起作用)。递归函数的主体将创建一个新节点并将其添加到列表的末尾。每增加一个节点到我们的列表中,大小应该增加一个。 希望这给你足够的信息来做你自己的。如果你需要更多的帮助,请问。