Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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++中的递归写一个函数来反转链表。我这样做了,推理对我来说似乎是正确的,但代码不起作用。有人能解释一下为什么吗?谢谢大家!_C++_Recursion_Linked List - Fatal编程技术网

函数使用c+;中的递归反转链表+; 我必须用C++中的递归写一个函数来反转链表。我这样做了,推理对我来说似乎是正确的,但代码不起作用。有人能解释一下为什么吗?谢谢大家!

函数使用c+;中的递归反转链表+; 我必须用C++中的递归写一个函数来反转链表。我这样做了,推理对我来说似乎是正确的,但代码不起作用。有人能解释一下为什么吗?谢谢大家!,c++,recursion,linked-list,C++,Recursion,Linked List,这就是功能: list* reverseList(list* head, list* p, list* n){ if(head->next == NULL){ head->next = p; p = head; head = n; n = NULL; return head; } else{ head->next = p; p = head

这就是功能:

list* reverseList(list* head, list* p, list* n){

    if(head->next == NULL){
        head->next = p;
        p = head;
        head = n;
        n = NULL;
        return head;
    }

    else{
        head->next = p;
        p = head;
        head = n;
        n = n->next;
        return reverseList(head, p, n);
    }

}

这是列表结构:

struct list{
    int val;
    list *next;
};
这是主要问题:

int main() {
    list *head, *p1, *p2, *prev, *next;

    head = new list;
    head->val = 1;
    p1 = new_node(head, 2);
    p2 = new_node(p1, 3);
    p2->next = NULL;
    print_list(head);

    prev = NULL;
    next = head->next;

    reverseList(head, prev, next);
    print_list(head);

    return 0;
}
这些是我用来创建具有值的新节点和打印列表的其他函数:

list* new_node(list* old_node, int value)
{
    old_node->next = new list;
    old_node->next->val = value;
    return old_node->next;
}

void print_list(list* head){
    while(head != NULL){
        cout << head->val << endl;
        head = head->next;
    }
}
list*新节点(list*旧节点,int值)
{
旧节点->下一步=新列表;
旧节点->下一步->值=值;
返回旧节点->下一步;
}
无效打印列表(列表*标题){
while(head!=NULL){
下一步;
}
}

您的代码有两个问题

  • 未收集
    reverseList
    的返回值,返回值应为
    head=reverseList(head,prev,next)
  • head->next==NULL
    上的
    reverseList
    中,您需要返回上一个指针,而不是下一个指针,它无论如何都指向NULL
  • 甚至可以简化为,

    void reverseList(list* &head, list* &p) {
        if (!head) return;
        list* t = head->next;
        head->next = p;
        p = head;
        if (t)
        {
            head = t;
            reverseList(head, p);
        }
    }
    

    并称为like
    reverseList(head,prev)

    您应该添加
    main
    ,并发布一个剪贴,它可以被复制、编译和运行。添加完整的代码,以便我们可以编译并查看结果。提示:
    *p
    是一个指针,但
    p
    只是一个本地to函数,在调用函数时不会做任何更改。我添加了编译所需的所有代码,直到链接列表为null,当函数retrun时,您的最后一个值在堆栈中,如果(p->next==null),您可以在某些数组或其他地方打印或存储该值cout data else p=p->next;p是指向列表的指针。它似乎可以工作,您需要做的是打印列表(p2)反转后,头部不再是头部`
    void reverseList(list* &head, list* &p) {
        if (!head) return;
        list* t = head->next;
        head->next = p;
        p = head;
        if (t)
        {
            head = t;
            reverseList(head, p);
        }
    }