【发布时间】:2022-01-18 19:31:53
【问题描述】:
我有一个普通的链表:
struct node{
int info;
node* next;
};
我需要编写一个递归函数,将 k 个元素后通过引用传递的给定链表拆分为 2,将前 k 个节点留在此列表中,并返回带有其余节点的第二个列表。
我的迭代解决方案如下所示:
node* split(node*&L, int k){
node* M;
node* head = L;
while(k>1){
head=head->next;
k--;
}
M = head->next;
head->next = NULL;
return M;
}
Output:
L: 1 2 3 4 5 6
after split with: k = 3
L: 1 2 3
M: 4 5 6
这似乎工作得很好。现在我真的想不出一个递归解决方案。我正在尝试:
node* splitL(node*&L, int k){
if(!L) return 0;
if(k<=1){
node* x = L->next;
L->next = NULL;
return x;
}
L->next = splitL(L->next, k-1);
return L;
}
这显然是错误的,因为它将 x 返回到 L->next 所以两个列表都变为 1 2 3 4 5 6。
如何为此编写递归函数?参数和返回类型应该保持不变。如果有人能解释我如何将我的迭代解决方案转换为递归解决方案,那就太好了。
【问题讨论】:
-
这听起来不像需要递归。是什么让您认为需要它?
-
请提供minimal reproducible example 以证明递归方法的成功和递归方法的失败。
-
为什么要修改L->next的值:
L->next = splitL(L->next, k-1);。我认为调用splitL(L->next, k-1);并返回该值就足够了 -
我没有说需要递归来解决这个问题,我显然是用迭代函数解决的。我正在学习递归,这是我一直坚持的练习。
-
@EduardoPascualAseff:是的,你是对的,这可以解决问题。
标签: c++ function recursion linked-list nodes