1. 程式人生 > >92. Reverse Linked List II【遍歷一遍就反轉連結串列】

92. Reverse Linked List II【遍歷一遍就反轉連結串列】

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

For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given m, n satisfy the following condition:
1 ? m ? n ? length of list.

思路:
這裡寫圖片描述

程式碼:

/**
 * 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 (m==n) return head; ListNode* left = NULL; ListNode* curr = head; for(int i = 1; i < m; ++i) { left = curr; curr = curr->next; } // reverse
ListNode* end = curr; ListNode* prev = curr; curr = curr->next; for(int i = m; i < n; ++i) { ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } // link to the right-part
end->next = curr; if (left) { left->next = prev; return head;} return prev; } };