给定此方法:
mergeSorted(struct ListNode * a, struct ListNode * b) {
struct ListNode * result = NULL;
if (a == NULL) return b;
if (b == NULL) return a;
if (a->data <= b->data) {
result = a;
result->next = mergeSorted(a->next, b);
}
else {
result = b;
result->next = mergeSorted(a, b->next);
}
return result;
}我知道列表是如何排序的,除了第一行,它将struct结果设置为NULL。每次递归调用该方法时,结果列表怎么会不设为NULL呢?我的第一个想法是指针被设置为NULL,而不是列表本身的实际内容,但这仍然不能让我完全理解。非常感谢您的帮助!
发布于 2015-10-03 00:04:50
“‘result”是在函数中定义的。它不会影响此函数的其他迭代,这些迭代在其自身的局部范围内具有“result”。
每次函数返回时,它都会将“result”的本地内容附加到调用函数的“result”的末尾。
result->next = mergeSorted(..);这个递归的return/append构建整个排序列表,并最终从它最初调用的地方返回。
发布于 2015-10-03 00:11:33
NULL赋值被赋予一个新的struct listnode指针,该指针返回的是结果,而不是传入的值,并且这个新指针的创建和NULL赋值不会触及函数的前一次迭代的结果指针(这是一个作用域问题,新指针具有相同的名称,但不是相同的指针,因为它存在于一个全新的作用域中)。
发生的事情是你是:
在每一级递归中,您的结果结构只有一个值,直到递归结束并开始解开,这导致每一级递归将其结果报告给先前的迭代结果结构,直到您到达原始调用。
我唯一好奇的是这个递归实际上是如何结束的,我看不出这个东西在它处理的每个结构被消耗后会停止运行的原因(除非设置struct result = struct a以某种方式消耗了a中的所有数据并使其为空,我不再太熟悉C结构了)。
https://stackoverflow.com/questions/32910953
复制相似问题