92. Reverse Linked List II
阿新 • • 發佈:2018-06-05
link 通過 AR start fin rev diff between pass
問題描述:
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL
解題思路:
這裏要求翻轉第m個節點到第n個節點的順序。
我們可以先通過m與n之間的距離(n-m)確定一個滑動窗口:頭節點為start,尾節點為end,然後再根據m來找到窗口具體的起始位置
現將塊的頭尾翻轉,即:
start->next = end->next;
pre(頭節點的前一個節點)-> next = end
需要註意的是!
邊界情況當m等於1時!我們可以吧head直接指到end節點。
代碼:
/** * 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) { if(!head || (m == n)) return head; ListNode *start = head; ListNode *end = head; ListNode *p = head; int diff = n - m; while(diff){ p = p->next; diff--; } start= head; end = p; ListNode *pre = start; for(int i = 1; i < m; i++){ pre = start; start = start->next; end = end->next; } ListNode* nextN = end->next; //start to reverse if(m == 1){ head = end; }else{ pre->next = end; } p = start->next; pre = start; start->next = nextN; while(p != nextN){ ListNode* temp = p->next; p->next = pre; pre = p; p = temp; } return head; } };
92. Reverse Linked List II