You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归反转链表函数失效求助:仅输出原链表首节点

问题分析与修正

你的递归反转链表函数存在核心逻辑错误:最上层的头指针没有被更新为反转后的新头节点,导致最终输出仅显示原首节点(该节点的next已被设为NULL,成为孤立节点)。

错误原因

原函数中,递归调用的是reverseListRec(head1->next),传递的是当前节点next指针的引用。递归到链表末尾时,base case会将下层递归的head1(即上层节点的next)设为最后一个节点(新头),但最上层的head1(即main函数中的head)始终未被更新,仍然指向原首节点。最后原首节点的next被设为NULL,所以输出仅显示它。

修正方案

推荐将递归函数改为返回反转后的新头节点,这种方式逻辑更清晰,也能正确更新main中的头指针:

node* reverseListRec(node* head) {
    // base case:空链表或只有一个节点,直接返回自身
    if (head == nullptr || head->next == nullptr) {
        return head;
    }
    // 递归反转剩余链表,得到新头节点
    node* newHead = reverseListRec(head->next);
    // 将当前节点的下一个节点的next指向当前节点
    head->next->next = head;
    // 当前节点的next设为NULL,作为新链表的尾节点
    head->next = nullptr;
    // 返回新头节点
    return newHead;
}

调用方式修改

在main函数中,将返回的新头节点赋值给原head指针:

node *head = nullptr;
cin >> head;
// 用反转后的新头更新原head
head = reverseListRec(head);
cout << head << endl;

原函数的另一种修正(保留引用参数)

如果坚持使用引用参数,需要在递归后将当前层的head1更新为新头节点,但这种方式不如返回值清晰:

void reverseListRec(node *&head1) {
    if (head1 == nullptr || head1->next == nullptr) {
        return;
    }
    node* temp = head1;
    // 递归反转剩余链表
    reverseListRec(head1->next);
    // 调整指针
    temp->next->next = temp;
    temp->next = nullptr;
    // 将当前层的head1更新为新头(即原head1->next,递归后已指向新头)
    head1 = head1->next;
}

内容的提问来源于stack exchange,提问作者Anurag Hale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:07:36