[LeetCode] 92. Reverse Linked List II

1. 原題連接:https://leetcode.com/problems/reverse-linked-list-ii/

2. 解題思路

  1. 採用頭插法進行反轉
  2. 利用啞節點將邊界case轉化爲通常case

3. 算法

  1. head2指針用於進行頭插操做的頭部指針
  2. 首先,將head2指針指向鏈表m-1的位置
  3. 而後,設置prev和cur指針遍歷m到n-1位置的鏈表,依次對這些節點進行反轉

4. 實現

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode dummy(-1);
        dummy.next = head;  //建立一個包含啞節點的鏈表
        
        //遍歷到m-1的位置,當m爲1時,此時啞節點就能夠將這種邊界case轉化爲通常case
        ListNode *prev = &dummy;
        for(int i = 0; i < m-1; i++){
            prev = prev->next;
        }
        ListNode * const head2 = prev;
        
        //採用頭插法反轉鏈表
        //反轉至少須要兩個節點,經過prev和cur兩個節點實現反轉
        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;
    }
};
相關文章
相關標籤/搜索