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

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) {
        ListNode *L = new ListNode(0);
        L->next = head;
        ListNode *p = L;
        ListNode *q = head;
        for(int i=1;i<m;i++) {
            p = q;
            q = q->next;  // 找到反转的起始位置
        }
        for(int i=0;i<n-m;i++) { // 反转
            ListNode *t = q->next;
            q->next = t->next;
            t->next = p->next;
            p->next = t;
        }
        return L->next;
    }
};