Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
/**
* 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* first=new ListNode(0);
first->next=head;
int cnt=1;
for(int i=0;i<m-1;++i){
first=first->next;
cnt++;
}
ListNode* old_pre=first;//参与反转的结点的前一个
ListNode* cur=first->next;//参与反转的第一个结点
ListNode* cur_next=cur->next;//参与反转的第二个结点
ListNode* new_pre=cur;//参与反转的结点的第一个
ListNode* temp;//用于反转的代替结点
/*反转*/
while((cur !=NULL)&&(cnt<n))
{
temp=cur_next->next;
cur_next->next=cur;
cur=cur_next;
cur_next=temp;
cnt++;
}
old_pre->next=cur;//参与反转的前一个结点指向最后一个反转结点
new_pre->next=cur_next;//参与反转的第一个结点指向最后一个反转节点的下一个。
/*当m==1时,此时的第一个结点就变成了最后一个反转结点
当m!=1时,就返回原先的头结点即可*/
if(m==1) return cur;
else return head;
}
};
贴个图