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;
}
上面是递归链接列表的代码。我理解了程序,但最后* head_ref = rest;令我困惑。让我详细说明一下。
让我们举一个1-> 2-> 3
的例子in first recursion: first=1, rest=2
in second recursion: first=2, rest=3
in last recursion: first=3, rest=null
从那时起我们回去,在每一步中我们分配* headRef = rest 最后我们在第一步回来,我们的休息是2,我们分配* headRef = 2 但我们需要休息点3而不是2。 我相信我在这里遗漏了一些东西,但我无法解决这个问题,请帮帮我
我尝试打印首先和休息的地址。image shows that after recursion, address of rest doesn't change
提前致谢。
以上代码来自geeksforgeeks ......我评论过,但没有人帮助过我。
答案 0 :(得分:0)
请注意,rest
指针的地址在递归调用中传递。
当你从递归返回时,rest
指针变为指向'剩余列表'的'新'开头。
这意味着在您的示例中,rest将在每个向后递归步骤中更改为指向元素3。