1. 程式人生 > >92. Reverse Linked List II

92. Reverse Linked List II

link 通過 AR start fin rev diff between pass

問題描述:

Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ mn ≤ 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