【Leetcode C++】2_3. [code] 反轉鏈表Ⅱ

3. [code] 反轉鏈表Ⅱ

3.1. 題目

Leetcode 92

反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。

說明:
1 ≤ m ≤ n ≤ 鏈表長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

難度:中等

3.2. 思路

需要注意4個關鍵的節點:逆序段頭節點B及其前驅節點A,逆序段尾節點C及其後繼D
在這裏插入圖片描述

3.3. 代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        int change_len = n-m+1;
        ListNode* pre_head = NULL;  //關鍵節點A:逆序段頭節點的前驅節點
        ListNode* result = head; //輸出的結果鏈表的頭

        //while循環把指針head移到需要逆序段的頭
        for (int i = 0; i < m-1; ++i){
            pre_head = head;  //關鍵節點A:逆序段頭節點的前驅
            head = head->next;
        } 
        ListNode* changed_list_tail = head; //關鍵節點B:逆序段的頭節點,將來作爲逆序段的尾
        //將需要逆序段進行逆序
        ListNode* new_head = NULL;
        for (int i = m; i < n; ++i){
            ListNode* next = head->next;
            head->next = new_head;
            new_head = head;
        }
        //關鍵節點B指向是逆序段尾的後繼D
        changed_list_tail->next = head; 
        if (pre_head){
            pre_head->next = new_head;  //關鍵節點A指向C
        }
        else{
            result = new_head;
        }
        return result;
    }
};

也不知道爲啥,提交了超時了。

class Solution { 
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) { 
        // 1<=m<=n<=len
        ListNode dummy(-1); 
        dummy.next = head;
        ListNode *prev = &dummy; 
        for (int i = 0; i < m-1; ++i) 
            prev = prev->next;
        ListNode* const head2 = prev;
        prev = head2->next; 
        ListNode *cur = prev->next; 
        for (int i = m; i < n; ++i) { 
            prev->next = cur->next; 
            cur->next = head2->next; 
            head2->next = cur;
            cur = prev->next;
        }
        return dummy.next; 
    } 
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章