#include <iostream>
using namespace std;
template <class Object>
class LinkedList
{
public:
LinkedList( ) : front( NULL ) { }
void addFront( const Object & x )
{ front = new Node( x, front ); }
void print( ) const
{
for( Node *p = front; p != NULL; p = p->next )
cout << p->data << " ";
cout << endl;
}
void reverse( )
{ reverse( front ); }
private:
struct Node
{
Object data;
Node *next;
Node( const Object & d, Node * n )
: next( n ), data( d ) { }
};
Node *front;
// The recursive routine
// Links from first..last of list will be reversed.
// first will then point at original last node.
void reverse( Node * & first )
{
// Base case
if( first == NULL || first->next == NULL )
return;
Node *oldNext = first->next;
// Recursive reverse from next node onwards
// As a result, oldNext will point at the last node
// and the next pointer in first->next will be NULL.
reverse( oldNext );
// Set the next pointer in first->next to point back at
// first. Then make first's next pointer NULL.
// Then put first at the end of the list (which is
// the value stored in oldNext, after the recursive call).
first->next->next = first;
first->next = NULL;
first = oldNext;
}
};
int main( )
{
LinkedList<int> L;
for( int i = 0; i < 10; i++ )
L.addFront( i );
L.print( );
L.reverse( );
L.print( );
return 0;
}