递归反转链表函数失效求助:仅输出原链表首节点
问题分析与修正
你的递归反转链表函数存在核心逻辑错误:最上层的头指针没有被更新为反转后的新头节点,导致最终输出仅显示原首节点(该节点的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
相关产品推荐
相关产品推荐

