1. 程式人生 > >leetcode 92:反轉連結串列Ⅱ

leetcode 92:反轉連結串列Ⅱ

題目:反轉連結串列Ⅱ

  • 題目描述:
    反轉從位置 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; } };