我正在使用几乎所有的递归函数创建一个链表,我被困在复制构造函数上。链表具有头部和尾部虚拟节点。我有:
/* 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 :(得分:0)
我将描述答案,但我会把编码留给你,因为它似乎是家庭作业,你可能应该自己做。我希望能够允许的权力。递归应始终具有停止条件,将其放在函数的开头是一种很好的做法。您的递归函数duplicateNodes不需要整个列表o,只需要它的头部。 它需要做的是,基本上遍历o的节点并在列表中创建相应的节点,因此duplicateNodes将使用nodeBeingCopied-> next来调用自身。停止条件显然是nodeBeingCopied == null(尽管如果它在函数末尾,则nodeBeingCopied-> next == null也可以工作)。递归函数的主体将创建一个新节点并将其添加到列表的末尾。每次我们将一个节点添加到列表中时,大小应该增加一。 希望这能为您提供足够的信息来自行完成。如果您需要更多帮助,请询问。