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) { ListNode *p=head; ListNode *newhead=NULL,*first,*cur=NULL,*last; int count=1; if(m==1) //翻转头结点 { newhead=first=p; while(p) { if(count==n) return newhead; p=p->next;count++; first->next=p->next; p->next=newhead; newhead=p; p=first; } } else { newhead=head; while(p) { if(count+1==m) { cur=p; first=cur->next; } p=p->next;count++; if(cur&&count<=n) { last=cur->next; if(p!=first) { cur->next=p; first->next=p->next; p->next=last; p=first; } } } return newhead; } return newhead; } };