c - 当用作返回值时,临时堆栈分配的指针会发生什么?
问题描述
我正在做一些基本的 leetcode 问题。在这里,我尝试使用递归交换成对的单链表。下面的代码通过了测试,但有些地方让我无法理解。new_head
是在堆栈上创建的指针。我理解这意味着一旦函数返回它就会被清理并可能指向垃圾。假设它在这里“偶然”起作用并且不是正确的方法是正确的,还是我的理解错误?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head){
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* new_head;
new_head = head->next;
head->next = swapPairs(head->next->next);
new_head->next = head;
return new_head;
}
与上述代码相关的另一个问题:
如果我更改分配的顺序,我会得到堆栈溢出,但我无法理解为什么
new_head = head->next;
new_head->next = head;
head->next = swapPairs(head->next->next);
这条线new_head->next = head;
中没有涉及到的任何内容都不会影响递归中发生的事情 no (它必须有,但我错过了它)?
解决方案
第一个问题
Returnreturn new_head;
不会将对象返回new_head
给调用者。它将当前值返回new_head
给调用者。没事儿。
第二个问题
和:
new_head = head->next;
head->next = swapPairs(head->next->next);
new_head->next = head;
在swapPairs
被调用时,传递给它的值head->next->next
是列表中某个节点之外的地址head->next
。
和:
new_head = head->next;
new_head->next = head;
head->next = swapPairs(head->next->next);
在swapPairs
被调用时,传递给它的值head->next->next
是head
,因为new_head->next = head;
刚刚设置head->next->next
为head
。
推荐阅读
- php - 使用 manifest.json 在 php 中返回文件路径
- python-3.x - 避免 canvas create_window 与其他小部件重叠
- c# - 如何在 C# 中创建带有 URI 和时间输入的列表
- docker - 我可以固定 docker API 版本吗:客户端版本 1.38 太新了。支持的最高 API 版本为 1.37
- python - 对于 AWS SES boto3,send_email 函数所指的文档是什么类型的附件?
- javascript - Plesk 和 node-js
- jsp - 如何在数据库中的jsp文件中显示图像
- php - 如何在循环中有条件地执行数学?
- javascript - 停止 puppeteer 进程,直到全局 var 值从 false 更改为某个字符串
- android - Oreo 上的 DatePicker 错误:当系统设置 = 显示大小较大时,年份选择器不滚动