/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
struct ListNode* reverseBetween(struct ListNode* head, int m, int n )
{
    struct ListNode* Cur = head;
    struct ListNode* Prev = NULL;
    struct ListNode* temp1 = NULL;
    struct ListNode* temp2 = NULL;
    struct ListNode* Next = head->next;

    // 特殊情况处理
    if (m==n) {
        return head;
    }

    // 找到开始反转的节点,并记录开始反转的节点和前一个节点,分别是temp1,temp2
    for(int i = 0 ; i < m; i++)
    {
        temp2 = Prev;
        Prev = Cur;
        Cur = Next;
        Next = Next->next;
        temp1 = Prev;
    }
    // temp1 = Prev;
    // printf("%d",temp1->val);
    // printf("%d",temp2->val);

    // 对需要反转的区域进行反转
    for(int i = m ; i < n ; i++)
    {
        Cur->next = Prev;
        Prev = Cur;
        Cur = Next;
        if(Next != NULL)
        {
            Next = Next->next;
        }   
    }
    //printf("%d",Prev->val);

    // 进行反转区域的拼接
    temp1->next = Cur; 
    if(m == 1)  // 特殊情况处理
    {
        return Prev;
    }
    temp2->next = Prev;
    return head;
}






















// struct ListNode* reverseBetween(struct ListNode* head, int m, int n ){
//          //加个表头
//         struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
//         res->val = -1;
//         res->next = head;
//         //前序节点
//         struct ListNode* pre = res;
//         //当前节点
//         struct ListNode* cur = head;

//         struct ListNode* temp;
//         //找到m
//         for(int i = 1; i < m; i++){
//             pre = cur;
//             cur = cur->next;
//         }
//         //从m反转到n
//         for(int i = m; i < n; i++){
//             temp = cur->next;
//             cur->next = temp->next;
//             temp->next = pre->next;
//             pre->next = temp;
//         }
//         //返回去掉表头
//         return res->next;
//     }