#include <unistd.h>
class Solution {
  public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        
        ListNode* qq = head;
        ListNode* q = head;
        ListNode* pre = head;
        ListNode* ppre = head;

        for (int i = 0; i < m - 2; ++i)
            qq = qq->next;
        for (int i = 0; i < m - 1; ++i)
            q = q->next;
        for (int i = 0; i < n -1; ++i)
            pre = pre->next;
        for (int i = 0; i < n ; ++i)
            ppre = ppre->next;

        ListNode* x=q;
        ListNode* y=q;
        ListNode* cur=q->next;
        while(cur!=ppre)
        {
            y=cur;
            cur=y->next;
            y->next=x;
            x=y;
        }
        qq->next=pre;
        q->next=ppre;
        if(m==1)
        return x;  
        return head;
    }
};