/**
 * 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;
        LNode* priorNode = NULL;

        //定义m号节点
        LNode* mNode;
        //定义n号节点
        LNode* nNode;
        //定义m-1号节点
        LNode* mPreNode = newHead;
        //定义n+1号节点
        LNode* nNextNode;


        //接下来的任务就是把以上节点找到,即可
        //找到m
        for (int i = 1; i < m; i++) {
            mPreNode = mPreNode->next;
        }
        thisNode = mPreNode->next;
        //找到了m号节点
        mNode = thisNode;

        //双指针翻转
        for (int i = m; i <= n; i++) {
            LNode* tempNode = thisNode->next;
            thisNode->next = priorNode;
            priorNode = thisNode;
            thisNode = tempNode;
        }

        //此时thisNode指向n+1号节点 priorNode指向n号节点
        nNextNode = thisNode;
        nNode = priorNode;

        // 最后收尾操作
        // m号节点反转过来指向的节点为n+1号节点
        // n号节点因被m-1号e节点所指定
        mNode->next = nNextNode;
        mPreNode->next = nNode;

        return newHead->next;
    }
};
分析:
    要么m>1或者m==1,为了统一m,设置一个新的头结点,使得m>1
    n要么为最后一个节点,要么是大于n的e节点。
    
    m号节点反转过来指向的节点为n+1号节点
    n号节点因被m-1号e节点所指定,既是m-1号节点。