class Solution {
        //反转函数
    void reverseMy(ListNode* head)
    {
        ListNode* pre = head;
        ListNode* p = nullptr;
        while(pre)
        {
            ListNode *next = pre->next;
            pre ->next = p;
            p = pre;
            pre = next;
        }
    }
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        if(head == nullptr) return nullptr;
        ListNode *pre = new ListNode(0);
        pre->next = head;
        ListNode *cur = pre;
        for(int i = 0; i < m - 1;i++)
        {
            cur = cur->next;
        }
        
        //这个结点要移动的到右边缘处
        ListNode *rNode = cur;
        for(int i = 0; i < n - m + 1;i++)
        {
            rNode = rNode->next;
        }
        
        ListNode *lNode = cur->next;
        ListNode *next = rNode->next;
        
                //断开连接
        cur->next = nullptr;
        rNode->next = nullptr;
        
        reverseMy(lNode);
        //因为反转了,左边缘编程有右边缘了
        cur->next = rNode;
        lNode->next = next;
        return pre->next;
    }
};