Approach #1:
The Naïve way to do this, is to loop through the linked list
and increment a count variable with every iteration till null is encountered. Then
finally traverse again from the start to count/2.
Isn’t this the obvious approach…..
Let’s go to the not so obvious one…
Approach#2:
Maintain two pointers from the start of the linked list. A
fast and a slow pointer. Increment slow pointer by one and the fast pointer by
two. When the fast one reaches the end , the slow one wil reach the middle node
of the linked list.
Let’s try to code it:
Program:
#include<stdio.h> /*for printf & scanf*/
#include<stdlib.h> /*for malloc*/
struct node
{
int data;
struct node* next;
};
void insert(struct node** head_ref,int data)
{
struct node*
temp=(struct node*)malloc(sizeof(struct node));
temp->data=data;
temp->next=(*head_ref);
(*head_ref)=temp;
}
void findMid(struct node* head)
{
struct node*
slow_ptr=head;
struct node*
fast_ptr=head;
if (head!=NULL)
{
while(slow_ptr&&fast_ptr&&fast_ptr->next)
{
slow_ptr=slow_ptr->next;
fast_ptr=fast_ptr->next->next;
}
}
printf("\n\nThe Middle point of the given linked list is
%d\n",slow_ptr->data);
}
void printList(struct node* head)
{
struct
node*temp=head;
while(temp)
{
printf("%d
-> ",temp->data);
temp=temp->next;
}
printf("NULL");
}
int main()
{
struct node*
head=NULL;
int i;
for(i=1;i<=5;i++)
insert(&head,i);
printf("\nLinked List : \n\n");
printList(head);
findMid(head);
return 0;
}
Viva La Raza
Sid
No comments:
Post a Comment