题目描述:
Reverse a linked list from position m to n.
Notice
Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
Example
Given 1->2->3->4->5->NULL
, m = 2
and n = 4
, return1->4->3->2->5->NULL
.
Challenge
题目思路:
Reverse it in-place and in one-pass
这题和#35非常差不多,只不过需要先找到prev的位置(不再是dummy head),并且reverse (n-m)次就可以了。
Mycode(AC = 23ms):
/**
* Definition of singly-linked-list:
*
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The head of linked list.
* @param m: The start position need to reverse.
* @param n: The end position need to reverse.
* @return: The new head of partial reversed linked list.
*/
ListNode *reverseBetween(ListNode *head, int m, int n) {
// write your code here
if (head == NULL) return NULL;
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy, *cur = head, *next = head->next;
// find the correct 'prev' pointer
int start = 1, count = 0;
while (start < m) {
prev = prev->next;
start++;
}
// do reverse (n - m) times
cur = prev->next; next = cur->next;
while (count < n - m) {
cur->next = next->next;
next->next = prev->next;
prev->next = next;
next = cur->next;
count++;
}
return dummy->next;
}
};