ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* p = head->next;
ListNode* p_pre = head;
while (p) {
ListNode* p_next = p->next;
p_pre->next = p->next;
p->next = dummy->next;
dummy->next = p;
p = p_next;
}
return dummy->next;
}
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (n - m < 1) return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode *start = head;
ListNode* start_pre = dummy;
for (int i = 1; i < m; i++) {
start_pre = start;
start = start->next;
}
for (int i = 0; i < n - m; i++) {
ListNode* tmp = start->next;
start->next = start->next->next;
tmp->next = start_pre->next;
start_pre->next = tmp;
}
return dummy->next;
}