保存反转区间的首尾结点指针,用于反转;同时保存反转区间的前一个结点指针和后一个结点指针,用于反转之后的链接。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    void reverse_list(ListNode* left,ListNode* right){
        ListNode* pre = nullptr;
        ListNode* cur = left;
        while(pre!=right){
            ListNode* temp = cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
    }
    
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode* dummy_head=new ListNode{1001};
        dummy_head->next=head;
        ListNode* left=dummy_head;
        ListNode* right=dummy_head;
        ListNode* front_node=dummy_head;
        ListNode* back_node=dummy_head;
        while(--m) front_node=front_node->next;
        left=front_node->next; //反转区间的前一个结点
        while(n--) right=right->next;
        back_node=right->next; //反转区间之后的一个结点
        
        reverse_list(left, right);
        front_node->next=right;
        left->next=back_node;
        return dummy_head->next;
    }
};