[英]Reversing Linked List using recursion algorithm
我在理解反向链表的算法如何修复头指针方面遇到麻烦。
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;
}
我了解之前的所有内容,这是我没有得到的最后一行。
如果列表是1-> 2-> 3。 因此,recursiveReverse(2)会将* head_ref设置为3。但是当它返回recursiveReverse(1)时,这里的剩余点将指向2。因此,不应将* head_ref设置为2(这是不正确的),但是它不会其实。 这是如何运作的?
当调用recursiveReverse(2)时,recursiveReverse(1)传递一个引用给rest,该引用被recursiveReverse(2)修改为指向3。然后,当recursiveReverse(1)设置*head_ref = rest;
其余的实际上指向3。
另一种解释。 在递归调用之前的代码中,在上一个嵌套调用的下一个中,将rest设置为指向最后一个节点,在上一个调用中,在列表末尾将rest设置为NULL,但是在这种情况下,函数返回时不更新head_ref == rest,因此在第二次从recursiveReverse返回后,rest指向最后一个节点,并且不再进行更新。 “棘手的步骤”并不是那么棘手,如果它是一个嵌套调用,那么当recursiveReverse返回时,first-> next-> next将覆盖它。 如果是初始调用,则将第一个节点的下一个指针设置为null。 评论版本:
void ReverseList(NODE**a)
{
NODE *list; /* will be pointer to reversed list */
/* NULL check */
if(a == NULL || *a == NULL)
return;
/* recurse until last node is reached */
list = (*a)->next;
if (!list)
return;
ReverseList(&list);
/* list now points to what was last node */
/* reverse a next pointer */
(*a)->next->next = *a;
/* set current end of reversed list */
/* next gets over written if nested call */
(*a)->next = NULL;
/* set pointer to start of reversed list */
*a = list;
}
返回指针而不是使用双指针的替代版本:
NODE * ReverseList(NODE*a)
{
NODE *list; /* will be pointer to reversed list */
/* NULL check */
if(a == NULL)
return NULL;
/* recurse until last node is reached */
list = a->next;
if(list == NULL)
/* return pointer to last node */
return a;
list = ReverseList(list);
/* list now points to what was last node */
/* reverse a next pointer */
a->next->next = a;
/* set current end of reversed list */
/* next gets over written if nested call */
a->next = NULL;
/* return pointer to what was last node */
return list;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.