leetcode92. Reverse Linked List II

medium程度

題目:

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

把原地反轉整個鏈表一般化,原地反轉鏈表的第m到n個節點

我的解法是通過棧來存儲節點求解,時間空間複雜度都是O(N)

AC解:

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) 
    {
        if (m == n)
            return head;
        stack<ListNode*> s;
        //prev end 分別表示區段的前後一個節點
        ListNode *p = head,*prev = nullptr,*end = nullptr;
        int i = 1;
        while (i++ < m)
        {   
            prev = p;
            p = p->next;
        }
        
        i = 1;
        do
        {
            s.push(p);
            p = p->next;
        }while(i++ <= n - m);
        
        end = p;
        
        p = s.top();
        s.pop();
        if (m == 1)
            head = p;
        else
            prev->next = p;
        while(!s.empty())
        {
            ListNode* temp = s.top();
            s.pop();
            p->next = temp;
            p = p->next;
        }
        
        p->next = end;
        return head;
    }

這樣比較繁瑣,有一種時間複雜度O(N),空間複雜度O(1)的解法,一次一次的改節點來實現,比較簡單

AC解:

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) 
    {
        ListNode dummy(-1);
        dummy.next = head;
        ListNode* prev = &dummy;
        for (int i = 0; i < m - 1; i++)
            prev = prev->next;
        //prev在m所在節點
        ListNode* const head2 = prev;
        prev = head2->next;//head2在prev之前
        ListNode* cur = prev->next;//cur爲當前要改的
        for (int i = m; i < n; i++)
        {//每次要改三個節點,然後cur像後推進
            prev->next = cur->next;
            cur->next = head2->next;
            head2->next = cur;
            cur = prev->next;
        }
        
        return dummy.next;
    }
};



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