/**
不同与直接将链表翻转
直接链表翻转头结点摘下来对剩下所有链表进行头插
指定区间翻转
找到翻转位置的前驱节点,第一个节点不动(head也是翻转的尾部节点)将后面的节点一个一个摘下来进行头插,摘下后保持不断链
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        //声明一个头结点
        ListNode* h = new ListNode(-1);
        h->next = head;
        ListNode* pre = h;
        // 找到反转位置的前驱节点 且 不变 用于头插
       for(int i = 1; i < m; i++){
           pre = pre->next;
       }
       head = pre->next; // head 相当于反转的尾节点、防止断链、寻找遍历节点
       ListNode *r ; // 要操作的节点
        for(int i =m;i < n;i++){
            // 标记r,摘掉r,插入r
            r = head->next;
            head->next = r->next;
            r->next = pre->next;
            pre->next = r;
        }
        return h->next;
    }
};