画图
思考有两个端点,所以要四个指针保存。空间O1,时间ON
考虑m=1和n=len情况
/**
* 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||m==n) return head;
ListNode* prere=NULL; //保存第一个断点的前一个指针
ListNode* p=head;
for(int i=2;i<m;i++){
p=p->next;
}
if(m>1){
prere=p;
p=p->next;
}
// p=p->next;
ListNode* pre=NULL;
ListNode* s=NULL;
if(p){
s=p; //保存第一个断点的后一个指针
}
ListNode* q=NULL;
for(int i=m;i<n;i++){
if(p&&p->next){
q=p->next;
p->next=pre;
pre=p;
p=q;
}
else break;
}
ListNode* tmp=q->next; //tmp保存第二个断点的后一个指针
p->next=pre;
if(prere){
prere->next=p; //p保存的第二个断点的前一个指针
}
else{
head=p;
}
s->next=tmp;
return head;
}
};