此题比较容易,但是有一个小技巧,就是为了下面程序的一致性,让翻转链表结尾的指针多走一步。
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(m==n) return head;
ListNode *preRHead=NULL,*rHead,*p,*q,*prep;
p=q=head;
while(--m){
preRHead=p;
p=p->next;
}
rHead=p;
while(n--)q=q->next;(多走一步,这样就可以用一个循环解决,否则,当p==q的时候要特殊处理,因为此时,翻转链表时会同时改变p和q的值,而使循环判定出问题)
prep=p;//保持不变
p=p->next;
while(p!=q){
prep->next=p->next;
if(NULL!=preRHead)
preRHead->next=p;
p->next=rHead;
rHead=p;
p=prep->next;
}
if(NULL==preRHead)head=rHead;
return head;
}