C++ 使用递归反转链表时出现的问题
我被要求编写一个驱动函数来调用递归函数。我想知道我需要在驱动程序功能中做什么 此程序用于反转链接列表C++ 使用递归反转链表时出现的问题,c++,function,recursion,linked-list,C++,Function,Recursion,Linked List,我被要求编写一个驱动函数来调用递归函数。我想知道我需要在驱动程序功能中做什么 此程序用于反转链接列表 void invert_r() { //This is the driver function for recursive_invert nodeType<Type> *p, *q; q = first; p = first; recursive_invert(q, p); } nodeType<Type>* recursive
void invert_r()
{
//This is the driver function for recursive_invert
nodeType<Type> *p, *q;
q = first;
p = first;
recursive_invert(q, p);
}
nodeType<Type>* recursive_invert(nodeType<Type> *q, nodeType<Type> *p)
{
//Invert a linked list using recursion.
//DO NOT create any new node in your implementation
if(p -> link == NULL)
{
q -> link = p;
return p;
}
else
{
recursive_invert(p -> link, q) -> link = p;
}
return p;
}
void invert_r()
{
//这是递归逆的驱动函数
节点类型*p,*q;
q=第一;
p=第一;
递归逆(q,p);
}
nodeType*递归_反转(nodeType*q,nodeType*p)
{
//使用递归反转链表。
//不要在实现中创建任何新节点
如果(p->link==NULL)
{
q->link=p;
返回p;
}
其他的
{
递归逆(p->link,q)->link=p;
}
返回p;
}
很难说,只要我们看不到首先是什么。否则一切看起来都很好。这段代码有哪些具体问题?@g-makulik“first”是链表的第一个元素。我对驱动函数的使用和如何使用它感到困惑,然后调用我的递归函数…函数的输出是首先通过迭代方法反转链表。然后通过实现invert_r()来调用递归元素来转换回链表如果first是链表的第一个元素,我认为它们必须是nodeType的成员,那么invert_r函数的初始化应该如下所示:q=q->first;由于需要传递(指向)一个节点和(指向)下一个节点的指针,因此需要nodeType*p=first;节点类型*q=p->link代码>和可能first=recursive_invert(p,q)代码>,不是吗?至少,您不应该随意丢弃递归函数的返回值,因为它现在是列表的头(如果丢失它,您将无法再次到达列表的开头)。很难说,只要我们看不到first
是什么。否则一切看起来都很好。这段代码有哪些具体问题?@g-makulik“first”是链表的第一个元素。我对驱动函数的使用和如何使用它感到困惑,然后调用我的递归函数…函数的输出是首先通过迭代方法反转链表。然后通过实现invert_r()来调用递归元素来转换回链表如果first是链表的第一个元素,我认为它们必须是nodeType的成员,那么invert_r函数的初始化应该如下所示:q=q->first;由于需要传递(指向)一个节点和(指向)下一个节点的指针,因此需要nodeType*p=first;节点类型*q=p->link代码>和可能first=recursive_invert(p,q)代码>,不是吗?至少,您不应该随意丢弃递归函数的返回值,因为它现在是列表的开头(如果丢失了它,您将无法再次到达列表的开头)。您的代码看起来与OP的代码完全不同。它有一个不同的签名和不同的结构成员。John,它只是作为一个Algo的例子。请注意,我们希望答案能够解决问题中的具体问题。如果你有一个非常相关的替代方案,你可以考虑添加-但请一定要解决这个问题,并解释为什么,首先,一些解释会很好,但如果你补充说,我认为这可能是一个很好的答案;你的代码看起来一点也不像OP的代码。它有一个不同的签名和不同的结构成员。John,它只是作为一个Algo的例子。请注意,我们希望答案能够解决问题中的具体问题。如果你有一个非常相关的替代方案,你可以考虑添加-但请一定要解决这个问题,并解释为什么,首先,一些解释会很好,但如果你补充说,我认为这可能是一个很好的答案;
void recursiveReverse(struct node** head_ref)
{
struct node* first;
struct node* rest;
/* empty list */
if (*head_ref == NULL)
return;
/* suppose first = {1, 2, 3}, rest = {2, 3} */
first = *head_ref;
rest = first->next;
/* List has only one node */
if (rest == NULL)
return;
/* reverse the rest list and put the first element at the end */
recursiveReverse(&rest);
first->next->next = first;
/* tricky step -- see the diagram */
first->next = NULL;
/* fix the head pointer */
*head_ref = rest;
}