/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        int count = 1;
        ListNode* originalHead = head;
        ListNode* newBottom = nullptr;
        ListNode* tempNode = nullptr;
        ListNode* nodeM;
        ListNode* beforeNodeM = nullptr;
        if (m == n){
            return head;
        }
        while (head != nullptr){
            if (count > n){
                nodeM->next = head;
                break;
            }
            if (count == m){
                nodeM = head;
                beforeNodeM = tempNode;
            }
            if (count == n){
                if (beforeNodeM != nullptr){
                    beforeNodeM->next = head;
                }  
            }
            if (count >= m and count <= n){
                tempNode = head->next;
                head->next = newBottom;
                newBottom = head;
                head = tempNode;
            }else{
                tempNode = head;
                head = head->next;
            }       
            count += 1;
        }
        if (m == 1){
            return newBottom;
        }
        return originalHead;
    }
};