我的递归技巧很生疏。我一直在思考这个问题,在论坛上搜索了很长时间,但仍然无法理解。现在我正在查看来自斯坦福 CS ed 库的递归反转链表代码。
#include <stdio.h>
struct Node {
int x;
struct Node *next;
};
void Reverse(struct Node ** headRef){
struct Node* first;
struct Node* rest;
if(*headRef==NULL)
return;
first= *headRef;
rest= first->next;
if(rest==NULL)
return;
Reverse(&rest);
printf("Rest%d\n", (rest)->x); // I added this line to print rest
first->next->next=first;
first->next=NULL;
*headRef=rest;
}
void printList(struct Node* head){
if(!head)
return;
else{
printf("%d ", head->x);
printList(head->next);
}
}
void main(){
struct Node *head;
struct Node * node1= (struct Node*) malloc(sizeof(struct Node));
struct Node * node2= (struct Node*) malloc(sizeof(struct Node));
struct Node * node3= (struct Node*) malloc(sizeof(struct Node));
struct Node * node4= (struct Node*) malloc(sizeof(struct Node));
head= node1;
node1->next=node2;
node1->x=1;
node2->x=2;
node3->x=3;
node4->x=4;
node2->next=node3;
node3->next=node4;
node4->next=NULL;
Reverse(&head);
}
现在假设我有一个链表 1->2->3->4。我无法理解的是最后一行,它最终会将 headRef 设置为 4,我认为它应该将 headRef 设置为 2。我尝试执行该函数并打印出:
4
4
4
为变量休息。
但是,如果我将 Reverse 函数中的最后一行注释掉,它仍然会反转列表但会打印
4
3
2。
第二个结果我可以理解,但第一个结果似乎很混乱。语句“*headRef=rest”对变量 rest 有什么作用吗?它一直指向4是什么?
另外,如果我通过 *headRef 而不是 **headRef (最后一行没有注释掉),它会打印结果
4
3
2
也。
谁能给我解释一下记忆中发生了什么?太感谢了。