leetcode 206.反轉鏈表

題目

https://leetcode-cn.com/problems/reverse-linked-list/solution/
簡單 鏈表

我的題解

無。

題解

方法一:迭代
假設存在鏈表 1 → 2 → 3 → Ø,我們想要把它改成 Ø ← 1 ← 2 ← 3
在遍歷列表時,將當前節點的 next 指針改爲指向前一個元素。由於節點沒有引用其上一個節點,因此必須事先存儲其前一個元素。在更改引用之前,還需要另一個指針來存儲下一個節點。不要忘記在最後返回新的頭引用!

方法二:遞歸
遞歸版本稍微複雜一些,其關鍵在於反向工作。假設列表的其餘部分已經被反轉,現在我該如何反轉它前面的部分?假設列表爲:n1 → … → nk-1 → nk → nk+1 → … → nm → Ø
若從節點 nk+1nm 已經被反轉,而我們正處於 nk
n1 → … → nk-1 → nk → nk+1 ← … ← nm
我們希望 nk+1 的下一個節點指向 nk
所以,nk.next.next = nk;
要小心的是 n1 的下一個必須指向 Ø。如果你忽略了這一點,你的鏈表中可能會產生循環。如果使用大小爲 2 的鏈表測試代碼,則可能會捕獲此錯誤。

c

solution 1
迭代 T(n) = O(n) S(n) = O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *prev = NULL;
    struct ListNode *curr = head;
    while (curr != NULL) {
        struct ListNode *nextTemp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nextTemp;
    }
    
    return prev;
}

solution 2
遞歸 T(n) = O(n) S(n) = O(n)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
    if (head == NULL || head->next == NULL) return head;
    struct ListNode *p = reverseList(head->next);
    head->next->next = head;
    head->next = NULL;
    return p;
}

總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章