Развернуть часть списка используя 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) — это уж допишите самостоятельно...