#include template struct Node { T value; Node* next; Node(T value, Node* next = nullptr) : value(value), next(next) {} }; template struct Pair { T left; U right; Pair(T left, U right) : left(left), right(right) {} }; #define PII Pair #define NPII Node*> template void reverseSublist(Node*& list, int start, int end) { Node* prev = nullptr; // element before first in range Node* iter = list; // first element in range while (start > 0) { prev = iter; iter = iter->next; start--; end--; } Node* eter = iter; // last element in range Node* next = nullptr; // element after last in range for (int i = 0; i < end; i++) { eter = eter->next; next = eter->next; } prev->next = eter; Node* last; Node* prevLast; while (end > 0) { prevLast = iter; last = iter->next; for (int i = 1; i < end; i++) { prevLast = prevLast->next; last = last->next; } last->next = prevLast; end--; } prevLast->next = next; } template void reverseSublists(Node*& list, NPII* intervals) { while (intervals != nullptr) { reverseSublist(list, intervals->value->left, intervals->value->right); intervals = intervals->next; } } template void print(Node* list) { while (list != nullptr) { std::cout << list->value << " "; list = list->next; } std::cout << std::endl; } int main() { NPII* intervals = new NPII(new PII(1, 3), new NPII(new PII(2, 5), new NPII(new PII(5, 6)))); Node* list = new Node(11, new Node(4, new Node(3, new Node(7, new Node(13, new Node(4, new Node(5))))))); print(list); reverseSublists(list, intervals); print(list); NPII* temp = nullptr; while (intervals != nullptr) { delete intervals->value; temp = intervals->next; delete intervals; intervals = temp; } Node* temp1 = nullptr; while (list != nullptr) { temp1 = list->next; delete list; list = temp1; } }