One of the commonly used interview question is - how do you reverse a linked list?
If you talk about a recursive function to print the list in reverse order, you are so wrong. The question is to reverse the nodes of list. Not print the nodes in reverse order.
So how do you go about reversing the nodes.
You need to take each node and link it to previous node. But a singly linked list does not have previous pointer.
So if n1 is current node, n2 = n1->next, you should set
n2->next = NULL
But doing this would cut off the list at n2.
So the solution is recursion. That is to reverse n nodes n1,n2,n3... of a list,
But now the difficulty is regarding the head? Where is head and how do we set it?
Once we reach end of list viz n1->next ==NULL, this node must become new head of the list. We have to store it in a static variable, in order not to change it.
And this is the complete program.
You can download the program from here.
If you talk about a recursive function to print the list in reverse order, you are so wrong. The question is to reverse the nodes of list. Not print the nodes in reverse order.
So how do you go about reversing the nodes.
You need to take each node and link it to previous node. But a singly linked list does not have previous pointer.
So if n1 is current node, n2 = n1->next, you should set
n2->next = NULL
But doing this would cut off the list at n2.
So the solution is recursion. That is to reverse n nodes n1,n2,n3... of a list,
- reverse the sub list from n2,n3,n4....
- link n2->next to n1
- set n1->next to NULL
But now the difficulty is regarding the head? Where is head and how do we set it?
Once we reach end of list viz n1->next ==NULL, this node must become new head of the list. We have to store it in a static variable, in order not to change it.
- set current node =n1
- if lastnode set head =n1
- set node2 = nextnode
- recursively reverse list from node2 to end of list
- set node2->next = l1
- set l1->next = NULL
NODEPTR reverse_list(NODEPTR l1)
{
static NODEPTR head;
if(l1->next==NULL)
{
head = l1;
return l1;
}
else
{
NODEPTR node2 = l1->next;
reverse_list(node2);
node2->next = l1;
l1->next = NULL;
return head;
}
}
And this is the complete program.
#include<stdio.h>
#include<stdlib.h>
struct node
{
int n;
struct node *next;
};
typedef struct node * NODEPTR;
NODEPTR create_node(int value)
{
NODEPTR temp = (NODEPTR) malloc(sizeof(struct node));
temp->next = NULL;
temp->n = value;
return temp;
}
NODEPTR append_node(NODEPTR head, NODEPTR newnode)
{
NODEPTR temp = head;
if(temp==NULL)
return newnode;
while(temp->next !=NULL)
temp = temp->next;
temp->next = newnode;
return head;
}
void display_nodes(NODEPTR head)
{
NODEPTR temp = head;//redundant
while (temp!= NULL)
{
printf("%d====>",temp->n);
temp = temp->next;
}
printf("\n");
}
NODEPTR reverse_list(NODEPTR l1)
{
static NODEPTR head;
if(l1->next==NULL)
{
head = l1;
return l1;
}
else
{
NODEPTR node2 = l1->next;
reverse_list(node2);
node2->next = l1;
l1->next = NULL;
return head;
}
}
NODEPTR delete_node(NODEPTR head, NODEPTR dnode)
{
NODEPTR temp = head;
NODEPTR prev = NULL;
if(dnode==head)
{
head = head->next;
}
while (temp !=NULL && temp!=dnode)
{
prev = temp;
temp = temp->next;
}
if(prev!=NULL)
{
prev->next = temp->next;
}
free(dnode);
return head;
}
int main()
{
NODEPTR head;
NODEPTR newnode,dnode;
int numnodes,i;
//initialize head
head = NULL;
printf("Number of nodes = ");
scanf("%d",&numnodes);
for(i = 0;i<numnodes;i++)
{
int value;
NODEPTR newnode;
printf("node value=");
scanf("%d",&value);
newnode = create_node(value);
head = append_node(head,newnode);
}
printf("The linked list now is ");
display_nodes(head);
head = reverse_list(head);
printf("Now the list is ");
display_nodes(head);
}
You can download the program from here.
Comments
Post a Comment