struct node* swap(struct node * head,struct node * tail)
{
if(tail -> next != NULL)
head = swap(head, tail->next);
if(head == NULL)
return NULL;
tail -> next = head -> next;
head->next = tail;
head = tail -> next;
if(head == tail){//End of recursion
tail -> next = NULL;
return NULL;
}
return head;
}
}
1 2 3 4 5 6; head is at 1, tail is at 6
1 6 2 3 4 5; head is at 2, tail is at 5
1 6 2 5 3 4; head is at 3; tail is at 4
1 6 2 5 3 4; head is at 4; tail is at 4 stop here.
Full code:
/*Input the no. of items in list as parameter*/
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node * next;
};
void initialize(struct node** head, int n)
{
if(n == 0)
return;
printf("Enter the numbers of the list...\n");
*head = malloc(sizeof(struct node)); //Our initial list now points to a valid memory location which is the start of the list
scanf("%d", &((*head)->data));
(*head) -> next = NULL;
struct node *trav = *head; //Trav is used to complete the list, keeping head at beginning.
int i = 0;
while(++i < n)
{
trav ->next = malloc(sizeof(struct node));
trav = trav -> next;
scanf("%d", &trav->data);
trav -> next = NULL;
}
//Nothing to return as *head is updated at beginning
}
struct node* swap(struct node * head,struct node * tail)
{
if(tail -> next != NULL)
head = swap(head, tail->next);
if(head == NULL)
return NULL;
tail -> next = head -> next;
head->next = tail;
head = tail -> next;
if(head == tail){//End of recursion
tail -> next = NULL;
return NULL;
}
return head;
}
void printlist(struct node *head)
{
printf("The current list is: \n");
while(head != NULL){
printf("%d\t", head-> data);
head = head->next;
}
printf("\n");
}
int main(int argc, char* argv[])
{
if(argc < 2)
{
fprintf(stderr, "Please enter no. of items as parameter...\n");
exit(0);
}
struct node * list;
initialize(&list, atoi(argv[1]));
printlist(list);
printf("Modifying....\n");
swap(list, list->next);
printlist(list);
}