Развернуть часть списка с++
Очень прошу помощи.
Элементы списка от 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";
}
Если что-то не понятно, спрашивайте