#include <iostream>
template <class T>
struct Elem
{
T x;
Elem* next;
Elem(const T& x) : x(x), next(nullptr)
{}
};
template <class T>
Elem<T>* reverse_list(Elem<T>* head)
{
if (head == nullptr)
{
return nullptr;
}
Elem<T>* prev = nullptr;
do
{
auto next = head->next;
head->next = prev;
prev = head;
head = next;
}
while (head != nullptr);
return prev;
}
template <class T>
std::ostream& operator<<(std::ostream& os, const Elem<T>* head)
{
const Elem<T>* current = head;
while (current != nullptr)
{
os << current->x << " ";
current = current->next;
}
return os;
}
int main()
{
using Ei = Elem<int>;
Ei* head = new Ei(0);
Ei* tail = head;
for (int n = 1; n < 10; n++)
{
Ei* c = new Ei(n);
tail->next = c;
tail = c;
}
std::cout << head << std::endl;
Ei* rev = reverse_list(head);
std::cout << rev << std::endl;
return 0;
}