我试图理解下面的代码:
void recursiveReverse(struct node **head_ref)
{
struct node *first;
struct node *rest;
if (*head_ref == NULL)
return;
first = *head_ref;
rest = first->next;
if (rest == NULL)
return;
recursiveReverse(&rest);
first->next->next = first;
first->next = NULL;
*head_ref = rest;
}
我注意到,一旦代码超出recursiveReverse(&rest)
,变量rest
对所有递归调用都具有相同的值。但first->next
有不同的价值观。我能够通过将它们写在堆栈上并将其与每次调用进行比较来理解为什么first->next
具有不同的值。但我无法理解rest
如何对所有调用而不是堆栈中的(rest = first->next)
具有相同的值。如果问题不清楚或需要任何详细信息,请告诉我。谢谢
更新:我观察到,正确排列参数,如果我调用递归反向(rest)而不是revulsivereverse(&rest),则每个递归调用的rest值都会发生变化,就像revursion堆栈上的任何其他变量一样。我不明白电话中的区别和休息是什么。
请考虑以下输入。
1 2 3 4.
第一递归,
*Head_ref = 1;//value of head_Ref
first =1; // first=*head_ref;
rest=2;// rest=first->next;
第二次递归,
*Head_ref = 2;//value of head_Ref
first =2; // first=*head_ref;
rest=3;// rest=first->next;
第三次递归。
*Head_ref = 3;//value of head_Ref
first =3; // first=*head_ref;
rest=4;// rest=first->next;
第四递归,
*Head_ref = 4;//value of head_Ref
first =4; // first=*head_ref;
rest=NULL;// rest=first->next;
条件失败,它来到第三个递归,它调用的地方。
第三次递归,
first=3;
first->next->next=first// here it means the rest link.
first->next=NULL;// it will make the pointer that is end.
*head_ref=rest; // making the starting address in this recursion
现在列表是这样的,4 -> 3。现在 rest 的值更改为 4。
现在到了第二个递归,
其余将指向 4,但第一个>下一个指向 3。
first=2;
rest=4;
first->next->next=first// here it means the rest link.
first->next=NULL;// it will make the pointer that is end.
*head_ref=rest; // making the starting address in this recursion
所以现在head_ref指向 4。那么现在列表将是 4 -> 3 -> 2。
它涉及到第一个递归,
这里
first=1,rest=4, But first -> next =2.
first->next->next=first// here it means the rest link.
first->next=NULL;// it will make the pointer that is end.
*head_ref=rest; // making the starting address in this recursion
最后它变成了
4 -> 3 -> 2 -> 1.
所以现在列表颠倒了。这里的主要内容是使*head_ref
在递归结束时进入最后一个位置。
考虑一个链表1->2->3->4
。根据recursiveReverse()
,在满足(rest == NULL)
(节点'4')时递归函数调用的迭代中,*head_ref
= 4;在此之后,调用返回到上一个迭代(节点"3")。这里基本上rest
函数递归(节点'3')当前迭代的(= '4')变量实际上是上一次迭代(最后一个节点'4')的*head_ref
,其中*head_ref
计算为4。因此,在递归函数(节点'3')的末尾,我们正在做*head_ref = rest;
,即。 *head_ref
= 4,因为从函数迭代节点 = '4' 接收rest
为 4。现在,在从这些函数的下一个连续递归返回时,返回*head_ref
地址,该地址通过保持不变,因此语句*head_ref = rest;
始终给出相同的值。