为何单链表反转函数需使用双指针而非单指针?
单链表反转函数为何需要双指针参数?
要搞懂这个问题,核心得记住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
相关产品推荐
相关产品推荐

