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

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
        ListNode *begin = head;
        ListNode *end = head;
        ListNode *bef = dummy;
        while (--m) {
            bef = begin;
            begin = begin->next;
        }
        ++n;
        while (--n) {
            end = end->next;
        }
        ListNode *tmp = bef;
        while (begin != end) {
            ListNode *nxt = begin->next;
            begin->next = tmp;
            tmp = begin;
            begin = nxt;
        }
        bef->next->next = end;
        bef->next = tmp;
        return dummy->next;
    }
};

思路:反转链表。

先定位几个位置:

* begin:下标m表示的链表节点。

* end:下标n + 1表示的链表节点。因为反转链表后需要把反转后的尾节点连接到原链表的后续节点上。

* dummy:虚拟头节点。因为头节点也可能被反转,反转后需要找到新的头节点。

* bef:下标m - 1表示的链表节点。因为反转链表后需要把反转后的头节点连接到原链表前面的节点上。

然后利用begin、end和bef,按照反转链表那样做即可。