單鏈表反轉(zhuǎn)

一、問(wèn)題描述
初始狀態(tài):


目標(biāo)狀態(tài):

二、遞歸法
反轉(zhuǎn)單向鏈表
思路:先從前面遞歸到后面,使得每次遞歸時(shí)的指針指向當(dāng)前結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn);執(zhí)行時(shí)從最后面的兩個(gè)結(jié)點(diǎn)開(kāi)始反轉(zhuǎn),依次向前,將后一個(gè)鏈表結(jié)點(diǎn)指向前一個(gè)結(jié)點(diǎn),注意每次反轉(zhuǎn)后要將原鏈表中前一個(gè)結(jié)點(diǎn)的指針域置空,表示將原鏈表中前一個(gè)結(jié)點(diǎn)指向后一個(gè)結(jié)點(diǎn)的指向關(guān)系斷開(kāi)。

ListNode * ReverseList(ListNode * head)
{
    //遞歸終止條件:找到鏈表最后一個(gè)結(jié)點(diǎn)
    if (head == NULL || head->next == NULL)
        return head;
    else
    {
        ListNode * newhead = ReverseList(head->next);//先反轉(zhuǎn)后面的鏈表,從最后面的兩個(gè)結(jié)點(diǎn)開(kāi)始反轉(zhuǎn),依次向前
        head->next->next = head;//將后一個(gè)鏈表結(jié)點(diǎn)指向前一個(gè)結(jié)點(diǎn)
        head->next = NULL;//將原鏈表中前一個(gè)結(jié)點(diǎn)指向后一個(gè)結(jié)點(diǎn)的指向關(guān)系斷開(kāi)
        return newhead;
    }
}

理解:假如要當(dāng)前要反轉(zhuǎn)1->2,head永遠(yuǎn)指向結(jié)點(diǎn)1,而newhead是個(gè)固定值指向結(jié)點(diǎn)5.

三、非遞歸法
單鏈表反轉(zhuǎn)的遞歸方法和非遞歸方法
代碼一:
思路:利用兩個(gè)結(jié)點(diǎn)指針和一個(gè)頭結(jié)點(diǎn)指針head(用來(lái)記錄當(dāng)前結(jié)點(diǎn)的位置),分別指向前一個(gè)結(jié)點(diǎn)、當(dāng)前結(jié)點(diǎn)和下一個(gè)結(jié)點(diǎn),每次循環(huán)讓當(dāng)前結(jié)點(diǎn)的指針域指向前一個(gè)結(jié)點(diǎn)即可;每一次翻轉(zhuǎn)前需要先保存當(dāng)前節(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn),再進(jìn)行翻轉(zhuǎn),然后更新另外兩個(gè)結(jié)點(diǎn)指針。

public ListNode reverseList(ListNode head) {
    ListNode next = null;
    ListNode pre = null

    while (head != null) {
        next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

理解:假如1->2,則next指向2,且每次更新為2指向的結(jié)點(diǎn);pre指向1,且每次更新為1指向的結(jié)點(diǎn)。

代碼二


ListNode* reverseList2(ListNode* head) {
    if (head == NULL || head->next == NULL) 
        return head;
    ListNode* prev = head;
    ListNode* cur = head->next;
    ListNode* temp = head->next->next;
 
    while (cur){
        temp = cur->next; //temp作為中間節(jié)點(diǎn),記錄當(dāng)前結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的位置
        cur->next = prev;  //當(dāng)前結(jié)點(diǎn)指向前一個(gè)節(jié)點(diǎn)
        prev = cur;     //指針后移
        cur = temp;  //指針后移,處理下一個(gè)節(jié)點(diǎn)
    }
 
    head->next = NULL; //while結(jié)束后,將翻轉(zhuǎn)后的最后一個(gè)節(jié)點(diǎn)(即翻轉(zhuǎn)前的第一個(gè)結(jié)點(diǎn)head)的鏈域置為NULL
    return prev;
}

代碼二與代碼一思路一樣!

友情鏈接

力扣的題目

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容