/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
#include <cstddef>
typedef struct ListNode LNode;
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
    LNode *newHead = (LNode *) malloc (sizeof(LNode));
    newHead->next = head;
    LNode *thisNode = head;
    LNode *priorNode = newHead;
    //保证有两个以上的节点
    LNode *cutNode = newHead;
    //找到m
    for(int i = 1; i < m; i++) {
        cutNode = cutNode->next;
    }
    thisNode = cutNode->next;

    for(int i = m; i <= n; i++) {
        LNode *tempNode = thisNode->next;
        thisNode->next = priorNode;
        priorNode = thisNode;
        thisNode = tempNode;
    }

    cutNode->next->next = thisNode;
    cutNode->next = priorNode;
    return newHead->next;
    }
};