Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用递归反转链表时出现的问题_C++_Function_Recursion_Linked List - Fatal编程技术网

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;              
}