【发布时间】:2021-05-10 10:26:04
【问题描述】:
这是我使用的原始代码:
void split(Node*& in, Node*& odds, Node*& evens)
{
/* Add code here */
if (!in)
{
odds = NULL;
evens = NULL;
return;
}
else if (in->value % 2 == 1)
{
odds = in;
return split(in->next, odds->next, evens);
}
else
{
evens = in;
return split(in->next, odds, evens->next);
}
}
我需要删除原始链表,同时将值转移到新链表。根据问题,我必须像以前一样使用递归。如果我现在打印它,那么它会选择第一个节点并打印与该节点关联的链表。 例如,对于下面给出的测试代码,我得到
18 3 5 6 8 9
18 6 8
3 5 9
18 6 8
作为输出,而我需要这个:
18 3 5 6 8 9
3 5 9
18 6 8
这里是测试代码:
void printList(Node* n)
{
while (n != NULL) {
cout << n->value << " ";
n = n->next;
}
cout << "\n";
}
int main()
{
Node* odds = NULL;
Node* evens = NULL;
Node* in = new Node{ 18, new Node{3, new Node{5, new Node{6, new Node{8, new Node{9, NULL} } } } } };
printList(in);
split(in, odds, evens);
printList(in);
printList(odds);
printList(evens);
return 0;
}
【问题讨论】:
-
在调用函数后不能简单地添加
in= NULL;吗? -
你的意思是
in = NULL;在 main 函数调用之后?如果这是你的意思,那是不允许的。我只需要提交拆分功能。 main 函数只是我为测试而创建的。 -
由于其他列表已经工作,一个简单的解决方法是编写一个小的包装函数来完成它。
-
那会是什么样子?我试图找出类似的东西,但我不完全确定如何去做。因为这是一个头递归函数。
-
嗯……是尾递归函数?此外,通过将节点从原始列表移动到结果列表可能会更优雅,不需要额外的删除工作。从头指针开始并将其归零,因此调用者会发现它为空。
标签: c++ recursion linked-list singly-linked-list