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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:07:14