class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode* dum = new ListNode(-1);
        dum->next = head;
        ListNode* pre = dum;
        for(int i = 1; i < m; i++){
            pre = pre->next; // 找到m的前一个结点
        }
        ListNode* next = nullptr;

        ListNode* current = pre->next; // 此时current处于m结点位置处

        for(int i = m; i < n; i++){
            next = current->next; // next指向m的下一个结点
            current->next = next->next; 
            next->next = pre->next;
            pre->next = next;
        }

        return dum->next;
    }
};

1.首先是定义一个哑结点,将其值赋值为-1,并令哑节点的下一个结点为链表的头结点
2.然后通过将pre赋值给哑结点通过一个for循环将pre定位到m所在位置的前一个结点
3.定义当前结点current指向结点m的位置处,定义next结点为空
4.通过在(m, n)之间使用for循环,先令next结点指向当前结点的下一个结点,现在便是要将next结点插入到pre结点之后
随后,让当前结点的下一个结点指向next结点的下一个结点,这样就确定了下一个要进行的结点的位置(这样的作用是为下一步的移动插入做准备,在整个函数中的作用类似与大家经常使用的p=p->next)
再然后,next结点需要插入到此时的current结点之前以及pre结点之后,
因此有了pre->next = next->next(此步用于将pre的下一个结点设定为next的下一个结点)
       next = pre->next,这样就可以让pre的下一个结点设定为next结点了