2. 解題思路
- 採用頭插法進行反轉
- 利用啞節點將邊界case轉化爲通常case
3. 算法
- head2指針用於進行頭插操做的頭部指針
- 首先,將head2指針指向鏈表m-1的位置
- 而後,設置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;
}
};