- Write a C program to print alternate nodes of given linked list.
- Function to print alternate nodes of a linked list.
Given a singly linked list, we have to find the middle node of given linked list. Let the length of linked list be N. Middle node of linked list will be (N/2 + 1)th node from beginning. For Example:
Input Linked List 1-->2-->3-->4-->5-->6-->7 Length of Linked List : 7 Middle Node : 4 Input Linked List 1-->2-->3-->4-->5-->6-->7-->8 Length of Linked List : 8 Middle Node : 5
Method 1
Find middle node of a linked list using slow and fast pointer.
Algorithm to print middle node of linked list
Let "head" be the head pointer of given linked list.
Let "head" be the head pointer of given linked list.
- We will use two pointers "front" and "back" pointer. Initially, set both pointer to head node.
- Using a loop, traverse linked list until fast pointer reached last node of linked list.(fast != NULL && fast->next != NULL)
- In every iteration, slow pointer will move one node whereas fast pointer will move two node.
- When fast pointer reaches last node then slow pointer will be pointing to middle node.
In this program, we will use a user defined function "printMiddleNode" which takes head node of a linked list as input and print middle node by implementing above mentioned algorithm.
void printMiddleNode(struct node *head){ /* Input Validation */ if(head == NULL){ printf("Error : Invalid Input !!!!\n"); return INT_MIN; } struct node *slow, *fast; slow = fast = head; while(fast != NULL && fast->next != NULL) { fast = fast->next->next; slow = slow->next; } printf("\nMiddle Node : %d\n", slow->data); }
C program to print middle node of a linked list.
#include <stdio.h> #include <stdlib.h> /* A structure of linked list node */ struct node { int data; struct node *next; } *head; void initialize(){ head = NULL; } /* Given a Inserts a node in front of a singly linked list. */ void insert(int num) { /* Create a new Linked List node */ struct node* newNode = (struct node*) malloc(sizeof(struct node)); newNode->data = num; /* Next pointer of new node will point to head node of linked list */ newNode->next = head; /* make new node as new head of linked list */ head = newNode; printf("Inserted Element : %d\n", num); } void printMiddleNode(struct node *head){ /* Input Validation */ if(head == NULL){ printf("Error : Invalid Input !!!!\n"); return INT_MIN; } struct node *slow, *fast; slow = fast = head; /* In every iteration, slow pointer will move one nede whereas fast pointer will move two node. When fast pointer reaches last node then slow pointer will be pointing to middle node */ while(fast != NULL && fast->next != NULL) { fast = fast->next->next; slow = slow->next; } printf("\nMiddle Node : %d\n", slow->data); } /* Prints a linked list from head node till tail node */ void printLinkedList(struct node *nodePtr) { while (nodePtr != NULL) { printf("%d", nodePtr->data); nodePtr = nodePtr->next; if(nodePtr != NULL) printf("-->"); } } int main() { initialize(); /* Creating a linked List*/ insert(3); insert(7); insert(12); insert(5); insert(9); printf("\nLinked List\n"); printLinkedList(head); /* Printing Middle Node of Linked List */ printMiddleNode(head); return 0; }Output
Inserted Element : 3 Inserted Element : 7 Inserted Element : 12 Inserted Element : 5 Inserted Element : 9 Linked List 9-->5-->12-->7-->3 Middle Node : 12
Method 1
Find middle node of a linked list by counting nodes in linked list.
Algorithm to print middle node of linked list
Let "head" be the head pointer of given linked list.
Let "head" be the head pointer of given linked list.
- Traverse the linked list and count total number of nodes in linked list. Let it be LENGTH.
- Now, traverse the linked list again till LENGTH/2 +1 node and print (LENGTH/2 +1)th