C语言原地反转单链表仅返回单个节点,求问题排查
单链表原地反转问题的修复方案
你的代码存在两个核心问题,导致反转后仅返回原头节点:
1. 丢失后续节点的引用
在reverse函数的循环中,你先修改了current_node->next的指向,之后直接用这个已经被修改的指针移动current_node,这会导致第一次循环后current_node就变成NULL,后续节点完全没被处理。
正确的操作是先保存当前节点原本的next指针,避免修改后丢失后续节点的地址。
2. 返回了错误的头指针
反转完成后,原链表的头节点已经变成了尾节点,新的头节点应该是原链表的最后一个节点——也就是循环结束时previus_node指向的节点。你现在返回的是传入的原head,自然只能看到一个节点。
修复后的reverse函数代码
node *reverse(node *head) { if (head == NULL) { return NULL; } node *previous_node = NULL; node *current_node = head; node *next_node; // 新增临时变量保存原next指针 while (current_node != NULL) { next_node = current_node->next; // 先保存下一个节点的地址 current_node->next = previous_node; // 修改当前节点的next指向 previous_node = current_node; // 移动previous到当前节点 current_node = next_node; // 移动current到之前保存的下一个节点 } return previous_node; // 返回反转后的新头节点 }
额外补充缺失的函数
你的代码还缺少insert_begining和destroy函数的实现,运行时会报错,这里补充完整:
insert_begining函数
node *insert_begining(node *head, node *new_node) { if (new_node == NULL) return head; new_node->next = head; return new_node; }
destroy函数
void destroy(node *head) { node *temp; while (head != NULL) { temp = head; head = head->next; free(temp); } }
内容的提问来源于stack exchange,提问作者AbuAminu
相关产品推荐
相关产品推荐

