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.
找到第m个结点,从这里翻转到n界点
分为三部分,翻转之前的,翻转的序列以及未翻转的
需要注意的是m=1的情况 添加一个头结点
/**
* 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) return head;
if(n==m) return head;
ListNode *first = new ListNode(-1);
first->next=head;
int cnt=1;
ListNode *pf=first;
ListNode *p=head;
while(p!=NULL){
if(cnt==m) break;
else{
pf=p;
p=p->next;
cnt++;
}
}
ListNode *cur=p;
ListNode *pre=p->next;
cur->next=NULL;
int gap=0;
while(pre!=NULL){
gap++;
ListNode *temp=pre->next;
pre->next=cur;
cur=pre;
pre=temp;
if(gap==(n-m)) {
pf->next=cur;
if(pre!=NULL)
p->next=pre;
break;
}
}
if(m==1){
head=pf->next;
}
return head;
}
};