leetcode 92:反轉連結串列Ⅱ
阿新 • • 發佈:2019-01-04
題目:反轉連結串列Ⅱ
- 題目描述:
反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉。
說明:
1 ≤ m ≤ n ≤ 連結串列長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
/**
* 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; //初始化開始逆置的節點前驅
ListNode *result = head; //最終轉換後的連結串列頭節點,非特殊情況即為head
while(head&&--m){ //將head向前移動m-1個位置
pre_head = head; //記錄head的前驅
head = head->next;
}
ListNode *modify_list_tail = head; //將modify_list_tail指向當前的head,即逆置後的連結串列尾
ListNode *new_head = NULL;
while(head&&change_len){ //逆置change_len節點
ListNode *next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--; //每完成一個節點逆置,change_len--
}
modify_list_tail->next = head; //連線逆置後的連結串列尾與逆置段的後一個節點
if(pre_head){ //如果pre_head不空,說明不是從第一個節點開始逆置的m>1
pre_head->next = new_head; //將逆置連結串列開始的節點前驅與逆置後的頭節點連結
}else{
result = new_head; //如果pre_head為空,說明m==1從第一個節點開始逆置結果即為逆置後的頭節點
}
return result;
}
};