Развернуть часть списка используя std::list<> с++

Очень прошу помощи.

Элементы списка от m до n переставить в обратном порядке на с++, используя готовый контейнер std::list<> .

Имеется ввиду, что в списке от 1 до 10, например, переставить от m=4 до n=6, чтобы вышло 1 2 3 6 5 4 7 8 9 10

Есть такой код, где std::list<> не используется:

#include <iostream>
#include <cassert>
 
struct node {
  int data;
  node* next;
};
 
void push_front(node** head, node* p) {
  assert(head && p);
  p->next = *head;
  *head = p;
}
 
void push(node** head, int data) {
  assert(head);
  node* p = new node;
  p->data = data;
  push_front(head, p);
}
 
node* pop_front(node** head) {
  assert(head);
  node* p = *head;
  if (p)
    *head = p->next;
  return p;
}
 
void clear(node** head) {
  assert(head);
  while (*head) {
    node* p = *head;
    *head = p->next;
    delete p;
  }
}
 
void print(const node* head) {
  while (head) {
    std::cout << head->data << ' ';
    head = head->next;
  }
  std::cout << std::endl;
}
 
void reverse(node** head, unsigned m, unsigned n) {
  assert(head);
  if (n <= m || !*head)
    return;
  node* left = nullptr;
  node* mid = *head;
  unsigned d = n - m + 1;
  while (mid && m--) {
    left = mid;
    mid = mid->next;
  }
  node* right = mid;
  while (right && d--)
    right = right->next;
  node* end = right;
  while (mid != end)
    push_front(&right, pop_front(&mid));
  if (left)
    left->next = right;
  else
    *head = right;
}
 
int main() {
  node* head = nullptr;
  for (int i = 10; i--;)
    push(&head, i);
  print(head);
  reverse(&head, 1, 8);
  print(head);
  clear(&head);
}

Ответы (1 шт):

Автор решения: Harry

Поскольку прямого доступа к внутренней структуре нет, обратимся к стандартной библиотеке... такое устроит?

void rev(list<int>& l, int pb, int pe)
{
    list<int> tmp;
    auto b = l.begin();
    tmp.splice(tmp.end(),l,next(b,pb),next(b,pe+1));
    tmp.reverse();
    l.splice(next(b,pb),tmp);
}

Только здесь нумерация индексов с 0, индексы указывают конец диапазона включительно, и нет защиты от дурака (типа проверки выхода за границы списка, того, что pb < pe) — это уж допишите самостоятельно...

→ Ссылка