求助:使用递归与指针指针反转链表时reversell函数输出异常
问题分析与修复方案
你的递归反转链表函数出现问题的核心原因是最外层的头指针没有被更新为反转后的新头节点,导致打印时只能访问到原来的第一个节点(它的next已经被设为NULL)。
问题出在哪里?
看你原来的reversell函数:
void reversell(node** head){ node* temp = (*head); if(temp->next == NULL){ (*head)=temp; return; } reversell(&(temp->next)); // 这里传入的是当前节点next的指针,而非最外层的head指针 node* temp1 = temp->next; temp1->next = temp; temp->next = NULL; }
当递归到最后一个节点时,你设置的(*head)=temp只是修改了当前递归层级中传入的指针(也就是上一个节点的next),而最外层的head指针(main函数中的那个)完全没有被更新为新的头节点(原链表的尾节点)。
递归结束后,原链表的第一个节点的next被设为NULL,而新的头节点(原尾节点)和后续节点虽然已经反转,但无法通过原head访问到,所以打印时只输出第一个节点。
修复后的代码
我们需要调整递归逻辑,确保最外层的head指针被更新为反转后的新头节点。以下是修复后的reversell函数:
void reversell(node** head){ // 空链表或只有一个节点,无需反转 if (*head == NULL || (*head)->next == NULL) { return; } // 保存当前头节点 node* curr = *head; // 保存剩余链表的头节点 node* rest = curr->next; // 递归反转剩余链表 reversell(&rest); // 将当前节点接到反转后链表的尾部 curr->next->next = curr; // 当前节点变为新链表的尾节点,next设为NULL curr->next = NULL; // 更新最外层head为反转后的新头节点 *head = rest; }
修复逻辑说明
- 终止条件:如果链表为空或只有一个节点,直接返回,无需反转。
- 递归处理剩余链表:先反转当前节点之后的所有节点,得到反转后的剩余链表的头节点
rest。 - 调整指针指向:把当前节点接到反转后剩余链表的尾部(即让原剩余链表的尾节点的
next指向当前节点)。 - 更新头指针:将最外层的
head设置为反转后的新头节点rest(也就是原链表的尾节点)。
测试验证
把修复后的函数替换到你的代码中,输入5个数字1-5后,输出会变成:
How many numbers do you want to add to linked list 5 Please Enter your numbers now 1 2 3 4 5 1 2 3 4 5 5 4 3 2 1 Process finished with exit code 0
完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者J Doe
相关产品推荐
相关产品推荐

