将链表分成三部分,区间左边的和区间右边的,再加上区间链表。写一个反转链表的函数,将区间的链表进行反转,然后拼接三个链表。这写的有点繁琐了

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

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    //反转链表
    ListNode* reverseList(ListNode* head)
    {
        if(!head) return NULL;
        ListNode* tmp = (ListNode*) malloc(sizeof(struct ListNode));
        ListNode* next = NULL;
        tmp->next = NULL;
        while(head)
        {
            next = head->next;
            head->next = tmp->next;
            tmp->next = head;
            head = next;
        }
        return tmp->next;
    }
    
    ListNode* reverseBetween(ListNode* head, int m, int n) 
    {
        if(m == n) return head;
        // write code here
        ListNode* begin = NULL, *end = NULL, *reverseHead = NULL, *reverseEnd = NULL;
        ListNode* tmp = head;
        int i = 1;
        while(tmp)
        {
            if(i == m)
                reverseHead = tmp;
            if(i == n)
            {
                reverseEnd = tmp;
                end = tmp->next;
                break;
            }
            tmp = tmp->next;
            i++;
        }
        i = 1;
        reverseEnd->next = NULL;  //断开链表
        reverseHead = reverseList(reverseHead); // 局部链表反转
        tmp = reverseHead;
        while(tmp->next)
             tmp = tmp->next;
        tmp->next = end;  //链接尾部链表
        if(m == 1) return reverseHead;
        tmp = head;
        while (tmp)
        {
            if(i == m-1)
            {
                begin = tmp;
                break;
            }
            tmp = tmp->next;
            i++;
        }
        begin->next = reverseHead;
        return head;
    }
};