#include <iostream>

struct Node
{
	int data;
	Node *next;
};

Node* push(Node *head, const int i)
{
	Node *elem = new Node;
	elem->data = i;
	
	if (!head)
		elem->next = nullptr;
	else
		elem->next = head;
	return elem;
}

void print(Node *head)
{
	while (head)
	{
		std::cout << head->data << " ";
		head = head->next;
	}
}

Node* reverse(Node *head)
{
    if(head == nullptr)
        return nullptr;
    Node *prev = nullptr;
    while(head->next != nullptr)
    {
        Node *next = head->next;
        head->next = prev;
        prev = head;
        head = next;
    }
    head->next = prev;
    return head;
}

int main() {
	Node *list = nullptr;
	for (int i = 0; i < 4; ++i)
		list = push (list, i);
	
	print (list);
	std::cout << std::endl;
	list = reverse (list);
	print (list);
	return 0;
}