Развернуть часть списка с++

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

Элементы списка от m до n переставить в обратном порядке на с++.

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

Желательно сделать две программы, через list и нет.

Вот пример задачи, что сделал, здесь просто список от m до n разворачивает:

#include <iostream>

using namespace std;

struct List1 {
    int curr;
    int value;
    List1 *next;
};

List1 *f_list;

int main()
{
    int m, n;
    cout << "m, n: ";
    cin >> m >> n;
    List1 *curr;
    for (int i = m;i <= n;i++) {
        curr = new List1;
        curr->value = i;
        curr->next = f_list;
        f_list = curr;
    }

    curr = f_list;
    while (curr != NULL) {
        cout << curr->value << " ";
        curr = curr->next;
    }
}

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

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

Можно попробовать так сделать:

int myArr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int m = 4;
int n = 6;
for (int i = 0; i < 10; i++)
{
    if (myArr[i] == m) myArr[i] = n;
    else if (myArr[i] == n) myArr[i] = m;
    cout << myArr[i] << endl;
}

Если что, то использовал using namespace std;

→ Ссылка
Автор решения: Bionik k

Вот пример задачи, что сделал, здесь просто список от m до n разворачивает:

#include <iostream>

using namespace std;

struct List1 {
    int curr;
    int value;
    List1 *next;
};

List1 *f_list;

int main()
{
    int m, n;
    cout << "m, n: ";
    cin >> m >> n;
    List1 *curr;
    for (int i = m;i <= n;i++) {
        curr = new List1;
        curr->value = i;
        curr->next = f_list;
        f_list = curr;
    }

    curr = f_list;
    while (curr != NULL) {
        cout << curr->value << " ";
        curr = curr->next;
    }
}
→ Ссылка
Автор решения: AR Hovsepyan

Если на С++, то можно написать и универсальную функцию:

template <class Cont>
void turn(Cont& x,  size_t m, size_t  n)
{
    if (n < m)
        std::swap(n, m);
    auto beg = std::next(std::begin(x), m);
    if (beg == std::end(x))
        return;
    auto    end = std::next(beg, n - m + 1);
    std::reverse(beg, end);         
}

и вызвать функцию с данными аргументами

→ Ссылка
Автор решения: avp

Эх, разомнусь с указателями в односвязном списке...

struct List1 {
    int curr;
    int value;
    List1 *next;
};

int main ()
{
  cout << "enter 3 numbers: list size, firsrt and last indexes for revert: ";
  int list_sz, m, n;

  for (;;) {
    cin >> list_sz >> m >> n;
    if (list_sz < 2 || m < 0 || n < 1 || m > list_sz - 1 || n > list_sz - 1 || m >= n) 
      cout << "wrong data, try again\n > ";
    else
      break;
  }

  List1 *list = 0, *curr;

  // make simple test list
  for (int i = 0; i < list_sz; i++) {
    curr = new List1;
    curr->value = i;
    curr->curr = (size_t)curr;
    curr->next = list;
    list = curr;
  }

  cout << "\nsource list:\n";
  for (curr = list; curr; curr = curr->next)
    cout << curr->value << '\n';

  // pointer to `.next` field  
  //  in the last non reversed node in the first part of source list
  List1 **end = &list; 
  curr = list;
  int i;
  for (i = 0; i < m; i++, curr = curr->next)
    end = &(curr->next);

  // reverse middle of the list (from `m` to `n` (inclusive))
  List1 *rlist = 0, 
        *endr = curr; // `endr` -- last in the reversed part
  for (; i <= n; i++) {
    List1 *t = curr->next;
    curr->next = rlist;
    rlist = curr;
    curr = t;
  }

  *end = rlist;
  endr->next = curr;

  cout << "\nlist with revert middle [" << m << ':' << n << "]\n";
  for (curr = list; curr; curr = curr->next)
    cout << curr->value << '\n';
  
  cout << "End\n";
}

Если что-то не понятно, спрашивайте

→ Ссылка