簡體   English   中英

使用遞歸算法反轉鏈表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM