此代码来自this site.
void recursiveReverse(struct Node** head_ref)
{
struct Node* first;
struct Node* rest;
/* empty list */
if (*head_ref == NULL)
return;
/* suppose first = {1, 2, 3}, rest = {2, 3} */
first = *head_ref;
rest = first->next;
/* List has only one node */
if (rest == NULL)
return;
/* reverse the rest list and put the first element at the end */
recursiveReverse(&rest);
first->next->next = first;
/* tricky step -- see the diagram */
first->next = NULL;
/* fix the head pointer */
*head_ref = rest;
}
我不明白为什么在最后一次递归调用后,rest的值仍然相同?我理解 recursiveReverse(& rest)正在传递休息的实际地址,但是这个地址不是仅由head_ref获取的吗?这意味着每个递归调用都有自己的第一个和休息的本地副本,因此 * head_ref = rest 不应该工作,因为rest的值会不断变化。
我的理解在哪里出错?
编辑:添加一些我的涂鸦。
答案 0 :(得分:0)
我不明白为什么在最后一次递归后调用rest的值 保持不变?
它命中递归调用的基本情况并立即返回。
/* List has only one node */
if (rest == NULL)
return;
每个递归调用都有自己的第一个和其余的本地副本吗?
是的,确切地说。 See how it works.
*head_ref = rest
不应该起作用,因为休息的价值会不断变化。
没有。它最终指向链表的最后一个元素,它将是第一个元素我的意思是最右边的节点(在未更改的列表中)将被指向。