Day_14 —— LeetCode 206:反轉鏈表

Day_14 —— LeetCode 206:反轉鏈表
在這裏插入圖片描述

題目要求我們分別用迭代和遞歸分別來實現。
感謝星球振哥的動態圖:

在這裏插入圖片描述

  1. 迭代的思路:在原鏈表之前建立一個新的newHead,然後從頭結點開始,將之後的一個結點移到newHead之後,重複此操作,直到head成爲尾結點爲止。
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *newHead = NULL;
        while (head) {
            ListNode *t = head->next;
            head->next = newHead;
            newHead = head;
            head = t;
        }
        return newHead;
    }
};
  1. 遞歸的思路:不斷的進入遞歸函數,直到head指向倒數第二個節點,因爲head指向空或者是最後一個結點都直接返回了,newHead則指向對head的下一個結點調用遞歸函數返回的頭結點,此時newHead指向最後一個結點,然後head的下一個結點的next指向head本身,這個相當於把head結點移動到末尾的操作,因爲是回溯的操作,所以head的下一個結點總是在上一輪被移動到末尾了,但head之後的next還沒有斷開,所以可以順勢將head移動到末尾,再把next斷開,最後返回newHead。
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *newHead = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return newHead;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章