#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
void printList(ListNode* head) {
while (head) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if (!head || left == right) return head;
ListNode dummy(0);
dummy.next = head;
ListNode* prev = &dummy;
for (int i = 0; i < left - 1; i++) {
prev = prev->next;
}
ListNode* curr = prev->next;
ListNode* next = nullptr;
cout << "Initial list before reversing: ";
printList(dummy.next);
// cout << "Current: " << curr->val << " Next: "<<next->val<<" Prev: "<<prev->val<<endl;
for (int i = 0; i < right - left; i++) {
next = curr->next;
curr->next = next->next;
next->next = prev->next;
prev->next = next;
cout << "After iteration " << i + 1 << ": ";
cout << "Current: " << curr->val << " Next: "<<next->val<<" Prev: "<<prev->val<<endl;
printList(dummy.next);
}
return dummy.next;
}
};
int main() {
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
int left = 2, right = 4;
Solution sol;
head = sol.reverseBetween(head, left, right);
cout << "Final reversed list: ";
printList(head);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IExpc3ROb2RlIHsKICAgIGludCB2YWw7CiAgICBMaXN0Tm9kZSAqbmV4dDsKICAgIExpc3ROb2RlKCkgOiB2YWwoMCksIG5leHQobnVsbHB0cikge30KICAgIExpc3ROb2RlKGludCB4KSA6IHZhbCh4KSwgbmV4dChudWxscHRyKSB7fQogICAgTGlzdE5vZGUoaW50IHgsIExpc3ROb2RlICpuZXh0KSA6IHZhbCh4KSwgbmV4dChuZXh0KSB7fQp9OwoKdm9pZCBwcmludExpc3QoTGlzdE5vZGUqIGhlYWQpIHsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgICAgY291dCA8PCBoZWFkLT52YWwgPDwgIiAiOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgfQogICAgY291dCA8PCBlbmRsOwp9CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIExpc3ROb2RlKiByZXZlcnNlQmV0d2VlbihMaXN0Tm9kZSogaGVhZCwgaW50IGxlZnQsIGludCByaWdodCkgewogICAgICAgIGlmICghaGVhZCB8fCBsZWZ0ID09IHJpZ2h0KSByZXR1cm4gaGVhZDsKICAgICAgICAKICAgICAgICBMaXN0Tm9kZSBkdW1teSgwKTsKICAgICAgICBkdW1teS5uZXh0ID0gaGVhZDsKICAgICAgICBMaXN0Tm9kZSogcHJldiA9ICZkdW1teTsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlZnQgLSAxOyBpKyspIHsKICAgICAgICAgICAgcHJldiA9IHByZXYtPm5leHQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIExpc3ROb2RlKiBjdXJyID0gcHJldi0+bmV4dDsKICAgICAgICBMaXN0Tm9kZSogbmV4dCA9IG51bGxwdHI7CiAgICAgICAgCiAgICAgICAgY291dCA8PCAiSW5pdGlhbCBsaXN0IGJlZm9yZSByZXZlcnNpbmc6ICI7CiAgICAgICAgcHJpbnRMaXN0KGR1bW15Lm5leHQpOwogICAgICAgIC8vIGNvdXQgPDwgIkN1cnJlbnQ6ICIgPDwgY3Vyci0+dmFsIDw8ICIgTmV4dDogIjw8bmV4dC0+dmFsPDwiIFByZXY6ICI8PHByZXYtPnZhbDw8ZW5kbDsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJpZ2h0IC0gbGVmdDsgaSsrKSB7CiAgICAgICAgICAgIG5leHQgPSBjdXJyLT5uZXh0OwogICAgICAgICAgICBjdXJyLT5uZXh0ID0gbmV4dC0+bmV4dDsKICAgICAgICAgICAgbmV4dC0+bmV4dCA9IHByZXYtPm5leHQ7CiAgICAgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OwogICAgICAgICAgICAKICAgICAgICAgICAgY291dCA8PCAiQWZ0ZXIgaXRlcmF0aW9uICIgPDwgaSArIDEgPDwgIjogIjsKICAgICAgICAgICAgY291dCA8PCAiQ3VycmVudDogIiA8PCBjdXJyLT52YWwgPDwgIiBOZXh0OiAiPDxuZXh0LT52YWw8PCIgUHJldjogIjw8cHJldi0+dmFsPDxlbmRsOwogICAgICAgICAgICBwcmludExpc3QoZHVtbXkubmV4dCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBkdW1teS5uZXh0OwogICAgfQp9OwoKCgppbnQgbWFpbigpIHsKICAgIExpc3ROb2RlKiBoZWFkID0gbmV3IExpc3ROb2RlKDEpOwogICAgaGVhZC0+bmV4dCA9IG5ldyBMaXN0Tm9kZSgyKTsKICAgIGhlYWQtPm5leHQtPm5leHQgPSBuZXcgTGlzdE5vZGUoMyk7CiAgICBoZWFkLT5uZXh0LT5uZXh0LT5uZXh0ID0gbmV3IExpc3ROb2RlKDQpOwogICAgaGVhZC0+bmV4dC0+bmV4dC0+bmV4dC0+bmV4dCA9IG5ldyBMaXN0Tm9kZSg1KTsKICAgIAogICAgaW50IGxlZnQgPSAyLCByaWdodCA9IDQ7CiAgICBTb2x1dGlvbiBzb2w7CiAgICBoZWFkID0gc29sLnJldmVyc2VCZXR3ZWVuKGhlYWQsIGxlZnQsIHJpZ2h0KTsKICAgIAogICAgY291dCA8PCAiRmluYWwgcmV2ZXJzZWQgbGlzdDogIjsKICAgIHByaW50TGlzdChoZWFkKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K