【演算法題】反轉連結串列的兩種方法

頭暈神教的神祕人發表於2020-12-16

反轉單連結串列的兩種辦法

方法一:

首先,建立一個與五個元素的單連結串列,定義三個指標,cur和next分別指向頭結點和它的下一個結點,newhead指標來儲存新的頭結點(newhead初始值為NULL)。

如圖:

在這裡插入圖片描述

第二步,將cur->next指向newhead,再將cur的值賦給newhead,然後cur和next向後移動,此時cur指向數字2,next指向3,如下圖:(這一步操作斷開了1和2之間的聯絡,1成為了新的頭結點,重複執行此步驟,類似於單連結串列的頭插)

在這裡插入圖片描述

後面的迴圈步驟用圖片演示:

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

最後一步,cur指向NULL,迴圈結束,此時newhead是逆轉後的連結串列的頭結點。

下面是具體的程式碼實現:(不包含該單連結串列結構體的定義)

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode*cur;
    struct ListNode*next;
    struct ListNode*newhead=NULL;
    cur=head;
    while(cur)
    {
        next=cur->next;
        
        cur->next=newhead;
        newhead=cur;
        cur=next;
    }
    return newhead;

}

方法二

第二種方法於第一種相比更加容易理解,建立三個指標 n1, n2, n3, n1初始值為NULL,n2為該連結串列的頭結點,n3為n2的下個結點,如下圖:
在這裡插入圖片描述

下一步操作與方法一類似,斷開n2和n3之間的聯絡,讓n2指向n1,然後更新n1 ,n2 ,n3,如圖:
在這裡插入圖片描述

然後繼續迴圈操作,直到n2指向NULL結束,n1即為逆轉後的連結串列的頭結點。

程式碼如下:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULl;
    n2=head;
    n3=n2->next;
    while(n2)
    {
        n2-next=n1;
        n1=n2;
        n2=n3;
        if(n3)   //判斷n3是否存在,若不存在則無需後續操作
            n3=n3->next;
    }
    return n1;
}
3;
        if(n3)   //判斷n3是否存在,若不存在則無需後續操作
            n3=n3->next;
    }
    return n1;
}

最後附上這道題目的leetcode連結:LeetCode逆轉單連結串列(其中有該單連結串列結構體的具體定義)

相關文章