关于递归实现链表末尾元素逆序打印的C程序中return语句与指针指向的技术疑问
解答你的链表递归困惑
你写的这个递归逆序打印链表最后2个元素的程序,在输入1、2、3时的运行结果符合预期,但你对两处递归相关的代码有疑问,咱们来逐个拆解:
问题1:if (head == NULL) return;语句中的return具体返回什么?
首先要注意,你的ReverseList函数没有显式声明返回类型,在C的旧标准中会默认当作int类型处理,但实际上这个函数不需要返回任何值,更规范的写法应该是把它声明为void ReverseList(struct node *head)。
回到这个return的作用:当head == NULL时,说明已经递归到了链表的末尾之后的空指针(也就是最后一个节点的next指向的位置),此时没有数据可以处理,所以用return;来终止当前这一层的递归调用,回到上一层调用它的地方。
因为函数默认是int类型但你没写返回值,这个return;实际上会返回一个不确定的整数(取决于编译器实现),但在你的代码里,我们完全不需要这个返回值——它的核心作用只是结束当前递归层级,让程序回到上一层继续执行后续代码(也就是count++;和打印逻辑)。
问题2:执行ReverseList(head->next);语句后,当前的head指针指向哪里?
这里要理解C语言中函数参数是按值传递的:每次调用ReverseList时,都会创建一个head参数的副本,这个副本只在当前函数调用中有效。
举个你的例子,当链表是1→2→3→NULL时:
- 第一次调用
ReverseList(head),这里的head指向节点1。 - 在节点1的函数中,执行
ReverseList(head->next),也就是传入节点2的地址,此时进入节点2的ReverseList函数。 - 在节点2的函数中,执行
ReverseList(head->next),传入节点3的地址,进入节点3的ReverseList函数。 - 在节点3的函数中,执行
ReverseList(head->next),传入NULL,进入这一层函数后触发if (head == NULL) return;,直接返回节点3的函数。 - 回到节点3的函数,执行后续的
count++和打印,然后返回节点2的函数。 - 回到节点2的函数时,当前的
head仍然指向节点2——因为刚才的递归调用只是传递了head->next的副本,并没有修改当前函数里的head指针。后续执行count++和打印,再返回节点1的函数。 - 回到节点1的函数时,
head还是指向节点1,继续执行后续逻辑。
简单来说:执行ReverseList(head->next)后,当前函数中的head指针完全没有变化,仍然指向调用这个递归函数之前的那个节点。递归调用只是去处理下一个节点的逻辑,处理完之后会回到当前节点,继续执行后面的代码。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

