关于指针按引用传递的疑问——单链表反转场景分析
为什么单链表反转函数传
Node*不行,必须传Node*&? 这问题真的戳中了C++指针参数传递的核心坑点,很多刚上手的同学都会在这里卡壳!我来给你掰扯清楚:
先搞懂C++的参数传递逻辑
在C++里,参数默认是值传递——也就是说,当你把一个变量传给函数时,函数会创建这个变量的副本,函数内部对副本的修改完全不会影响到原变量。
放到你的场景里:
- 当你用
void reverseLinkedList(Node* head)时,这里的head是main函数里原指针的副本。你在函数最后写的head = prev;,只是把这个副本的指向改成了新的头节点(原链表的尾),但main里的原指针还是死死指着原来的头节点(也就是1)。
结合你的代码具体分析
原链表是1->2->3:
- 用值传递时,函数内部确实完成了链表的反转操作——把每个节点的
next都改成了前一个节点,最后prev指向3(新的头)。 - 但函数里的
head副本被改成3后,main里的原head还是指向1,而此时1的next已经被改成NULL了!所以你打印的时候,只能输出1,然后就因为next是NULL停止了。 - 而当你用
Node*& head(指针的引用)时,函数里的head就是main里原指针的别名——相当于直接操作原变量。最后head = prev;会把main里的原指针直接改成指向3,这样打印的时候就能遍历整个反转后的3->2->1了。
补充:还有另一种写法
除了传指针的引用,你也可以传指针的指针(Node** head),效果是一样的。比如函数里最后写*head = prev;,也是直接修改原指针的指向。
内容的提问来源于stack exchange,提问作者Ayumu Kasugano
相关产品推荐
相关产品推荐

