ListNode* reverseBetween(ListNode* head, int l, int r) {
if(l == r) return head;
auto dummy = new ListNode(-1);
dummy->next = head;
auto a = dummy,b = dummy;
for(int i = 0; i < l - 1; i ++) a = a->next;
for(int i = 0; i < r; i ++ ) b = b->next;
auto c = a->next, d = b->next;
for(auto p = c,q = c->next;q != d;){
auto o = q->next;
q->next = p;
p = q,q = o;
}
a->next = b;
c->next = d;
return dummy->next;
}