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(head == NULL || head->next == NULL)
{
return head;
}
ListNode *sg = new ListNode(-1);
sg->next = head;
head = sg;
ListNode *pre = head;
for(int i = 1; i < m; i++)
{
pre = pre->next;
}
ListNode *cur = pre->next;
ListNode *cur_next = cur->next;
if(n - m > 0)
{
int step = n - m;
while(step > 0 && cur_next != NULL)
{
ListNode *temp = cur_next->next;
cur_next->next = cur;
cur = cur_next;
cur_next = temp;
step--;
}
ListNode *temp = pre->next;
pre->next = cur;
temp->next = cur_next;
}
head = head->next;
delete sg;
return head;
}
};