class Solution {
public:

ListNode* reverseBetween(ListNode* head, int m, int n) {
    if(m==n) return head;
     int i=1;
     ListNode *phead=head;
     ListNode *head_m=head;//第m个节点的前一个节点
     ListNode *after=nullptr;//第n个节点的后一个节点
     ListNode *first=nullptr;//第m个节点的前一个节点
    while(phead)
    {
        if(i+1==m)
        {
          first=phead;////第m个节点的前一个节点
          head_m=phead->next;//第m个节点     
        }
       if(i==n)
       {
          after=phead->next;//第n个节点的后一个节点
          phead->next=nullptr;//断链
           break; 
       }
        phead=phead->next;
        i++;
    }
     ListNode *pre=nullptr;
     ListNode *phead_m=head_m;
     while(phead_m)//这里实现翻转,pre最后就是第n个节点
     {
      ListNode *cur=phead_m->next;
      phead_m->next=pre;
      pre=phead_m;
      phead_m=cur;
     }
    head_m->next=after;//把上面断链的节点接上
    if(m==1) return pre;//如果m=1,说明直接是从链表头开始翻转的,直接返回
    else   
    {
        first->next=pre;//否则就需要把前面的接上
        return head;//然后返回头结点
    }
}  

};