/****************************************************/
** This is sample program to reverse a point list **
****************************************************
/****************************************************/
#include <stdio.h>
#include <stdlib.h>
struct tnode
{
int data;
struct tnode *next;
};
typedef struct tnode node;
/**
* Create a node list
* @param the size of node list
* @return the header pointer to the list
*/
node* createList(int size)
{
node* root = NULL;
node* pre = NULL;
for(int i=0;i <= size;i++)
{
node * cur = (node *)malloc(sizeof(node));
cur->data=i;
cur->next=NULL;
if (pre == NULL)
{
root = cur;
pre = cur;
}
else
{
pre->next = cur;
pre = cur;
}
}
return root;
}
/**
* Print out the content of list
*
* @param pointer to the head node
*/
void printList(node *root)
{
while(root!=NULL)
{
printf(" %d",root->data);
root=root->next;
}
printf("/n");
}
/**
* Delete all node list
*
* @param pointer to the head node
*/
void deleteList(node *root)
{
node *p = NULL;
while(root!=NULL)
{
p = root;
root = root->next;
free(p);
p=NULL;
}
}
/**
* Reverse a node list
*
* @param header point to the list
* @return new header after list is reversed.
*/
node * reverse(node *head)
{
node *tmp = head;
if ( head != NULL && head->next != NULL)
{
tmp = reverse(head->next); // new header
head->next->next = head;
head->next = NULL;
}
return tmp;
}
/**
* Reverse a node list using loop
*
* @param header point to the list
* @return new header after list is reversed.
*/
node * reverse2(node *head)
{
node * prev = NULL;
node * next = NULL;
while(head != NULL)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
int main()
{
node *root = createList(8);
printf("Before Reverse:"); printList(root);
root = reverse(root);
printf("After Reverse:"); printList(root);
deleteList(root);
return 0;
}