92. 反轉連結串列 II
阿新 • • 發佈:2018-12-05
反轉從位置 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; while(head && --m) { pre_head = head; //找到逆置段的前驅,m-1; head = head->next; }//此時head到達逆置段頭節點, ListNode *modify_list_tail = head;//將modify指向逆置段頭節點,也就是逆置後的尾結點 ListNode *new_head = NULL; while(head && change_len) {//處理逆置段 ListNode *next = head->next; head->next = new_head; new_head = head; head = next; change_len --; }//此時head到達逆置段後接節點 modify_list_tail->next = head;//將逆置完成段與後接節點連線。 if(pre_head) { pre_head->next = new_head; //連線前驅與逆置後的頭節點 } else { result = new_head; } return result; } };