反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。
說明:
1 ≤ m ≤ n ≤ 鏈表長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-linked-list-ii
思路:
代碼:
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->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--;
}
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;
}
};