反转链接列表的递归解决方案

时间:2016-07-05 12:20:40

标签: algorithm recursion data-structures linked-list

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 ......我评论过,但没有人帮助过我。

http://imgur.com/Dfb46xD

1 个答案:

答案 0 :(得分:0)

请注意,rest指针的地址在递归调用中传递。

当你从递归返回时,rest指针变为指向'剩余列表'的'新'开头。

这意味着在您的示例中,rest将在每个向后递归步骤中更改为指向元素3。