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

为何单链表反转函数需使用双指针而非单指针?

单链表反转函数为何需要双指针参数?

要搞懂这个问题,核心得记住C语言的函数参数是值传递——不管传的是普通变量还是指针,函数内部拿到的都是原变量的一份副本。

先看你写的单指针版本代码:

void  reverse(struct ListNode* head_ref)
{
    struct ListNode* prev = NULL;
    struct ListNode* current = head_ref;
    struct ListNode* next = NULL;
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    head_ref = prev;
}

这里的head_ref是外部头指针的副本:

  • 函数内部的反转逻辑是对的,prev确实指向了反转后的链表头;
  • 但最后head_ref = prev只是修改了这个副本的指向,外部原来的头指针完全没被改动,所以外部看不到反转后的结果。

再看双指针版本:

void  reverse(struct ListNode** head_ref)
{
    struct ListNode* prev = NULL;
    struct ListNode* current = *head_ref;
    struct ListNode* next = NULL;
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    *head_ref = prev;
}

这里head_ref是指向外部头指针的指针:

  • 传入的是外部头指针的内存地址,函数内部通过*head_ref直接操作外部头指针的内存空间;
  • 最后*head_ref = prev相当于把外部头指针的指向直接改成了反转后的新头prev,这样外部就能正确拿到反转后的链表了。

打个简单的类比:如果要修改一个int变量的值,你不能只传int a(改的是副本),得传int *a才能直接修改原变量。要修改指针的指向,逻辑是一样的——得传指针的指针,才能直接修改原指针的指向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:27:45