/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (head == nullptr || m == n) return head;
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* pre = dummy;
for (int i = 1; i < m; i++) {
pre = pre->next;
}
ListNode* start = pre->next;
ListNode* then = start->next;
for (int i = 0; i < n - m; i++) {
start->next = then->next;
then->next = pre->next;
pre->next = then;
then = start->next;
}
ListNode* result = dummy->next;
delete dummy;
return result;
}
};