递归复制链表(以及反向复制,但我稍后会越过那个桥。)
我有以下代码:
// In list.h
struct node {
int data;
node * next;
}
// In list.cpp
// Recursive copy wrapper
int list::copy() {
if(!head) {
return 0;
}
node *new_node = NULL;
return copy(new_node, head);
}
// Recursive copy function
int list::copy(node *& dest, node * src) {
if(!src) {
dest = NULL;
return 0;
}
dest = new node();
dest->data = src->data;
// *dest->next = src->next;* // Not sure what to do here?
return copy(dest->next, src->next) + 1; // count number of nodes copied
}
注意:这不是家庭作业,而是预备技术面试考试的问题。
在这一点上,我相当肯定我自己无法做到这一点,所以任何帮助都会受到赞赏。提前谢谢!
答案 0 :(得分:1)
根据我的理解,列表需要先递归复制,新头的引用需要指向副本的头部;这可以通过以下方式完成。
int list::copy(node *& dest, node * src)
{
if(!src)
{
dest = NULL;
return 0;
}
dest = new node();
dest->data = src->data;
node* TailCopy = null; // reference to copy of remaining list
int TotalNumOfNodes = 1 + copy(Tail, src->next) + 1;
dest->next = TailCopy; // let copy of head refer to copy of tail
return TotalNumOfNodes;
}
答案 1 :(得分:0)
好吧,int list::copy(node *& dest, node * src)
完全正确,并成功将列表尾部复制到另一个列表尾部。问题在于int list()
一个毫无意义的问题:你成功地将当前列表中的所有节点复制到一个新的链中,并在完成时无可挽回地泄漏所有内存!
如果你想构建一些有意义的东西,你可以在复制构造函数中使用递归副本:
list(const list& other) {
copy(head, other.head);
}
这不使用copy
(可能是静态)方法的返回值,我可以确认它是预期值。