# C Program To Delete N Nodes After M Nodes Of A Linked List

Given a linked list and two integers M and N. Traverse the linked list such that you retain M nodes then delete next N nodes, continue the same till end of the linked list.

Difficulty Level: Rookie **Examples:**

Input:M = 2, N = 2Linked List:1->2->3->4->5->6->7->8Output:Linked List:1->2->5->6Input:M = 3, N = 2Linked List:1->2->3->4->5->6->7->8->9->10Output:Linked List:1->2->3->6->7->8Input:M = 1, N = 1Linked List:1->2->3->4->5->6->7->8->9->10Output:Linked List:1->3->5->7->9

The main part of the problem is to maintain proper links between nodes, make sure that all corner cases are handled. Following is C implementation of function skipMdeleteN() that skips M nodes and delete N nodes till end of list. It is assumed that M cannot be 0.

## C

`// C program to delete N nodes after` `// M nodes of a linked list` `#include <stdio.h>` `#include <stdlib.h>` `// A linked list node` `struct` `Node` `{` ` ` `int` `data;` ` ` `struct` `Node *next;` `};` `/* Function to insert a node at` ` ` `the beginning */` `void` `push(` `struct` `Node ** head_ref,` ` ` `int` `new_data)` `{` ` ` `// Allocate node` ` ` `struct` `Node* new_node =` ` ` `(` `struct` `Node*) ` `malloc` `(` `sizeof` `(` `struct` `Node));` ` ` `// Put in the data ` ` ` `new_node->data = new_data;` ` ` `// Link the old list off the` ` ` `// new node` ` ` `new_node->next = (*head_ref);` ` ` `// Move the head to point to the` ` ` `// new node` ` ` `(*head_ref) = new_node;` `}` `// Function to print linked list` `void` `printList(` `struct` `Node *head)` `{` ` ` `struct` `Node *temp = head;` ` ` `while` `(temp != NULL)` ` ` `{` ` ` `printf` `(` `"%d "` `, temp->data);` ` ` `temp = temp->next;` ` ` `}` ` ` `printf` `(` `""` `);` `}` `// Function to skip M nodes and then` `// delete N nodes of the linked list.` `void` `skipMdeleteN(` `struct` `Node *head,` ` ` `int` `M, ` `int` `N)` `{` ` ` `struct` `Node *curr = head, *t;` ` ` `int` `count;` ` ` `// The main loop that traverses` ` ` `// through the whole list` ` ` `while` `(curr)` ` ` `{` ` ` `// Skip M nodes` ` ` `for` `(count = 1; count<M &&` ` ` `curr!= NULL; count++)` ` ` `curr = curr->next;` ` ` `// If we reached end of list,` ` ` `// then return` ` ` `if` `(curr == NULL)` ` ` `return` `;` ` ` `// Start from next node and` ` ` `// delete N nodes` ` ` `t = curr->next;` ` ` `for` `(count = 1; count<=N &&` ` ` `t!= NULL; count++)` ` ` `{` ` ` `struct` `Node *temp = t;` ` ` `t = t->next;` ` ` `free` `(temp);` ` ` `}` ` ` `// Link the previous list with` ` ` `// remaining nodes` ` ` `curr->next = t;` ` ` `// Set current pointer for next` ` ` `// iteration` ` ` `curr = t;` ` ` `}` `}` `// Driver code` `int` `main()` `{` ` ` `/* Create following linked list` ` ` `1->2->3->4->5->6->7->8->9->10 */` ` ` `struct` `Node* head = NULL;` ` ` `int` `M=2, N=3;` ` ` `push(&head, 10);` ` ` `push(&head, 9);` ` ` `push(&head, 8);` ` ` `push(&head, 7);` ` ` `push(&head, 6);` ` ` `push(&head, 5);` ` ` `push(&head, 4);` ` ` `push(&head, 3);` ` ` `push(&head, 2);` ` ` `push(&head, 1);` ` ` `printf` `("M = %d, N = %d` ` ` `Given Linked list is :",` ` ` `M, N);` ` ` `printList(head);` ` ` `skipMdeleteN(head, M, N);` ` ` `printf` `(` ` ` `"Linked list after deletion is :"` `);` ` ` `printList(head);` ` ` `return` `0;` `}` |

**Output: **

M = 2, N = 3 Given Linked list is : 1 2 3 4 5 6 7 8 9 10 Linked list after deletion is : 1 2 6 7

**Time Complexity:**

O(n) where n is number of nodes in linked list.

**Auxiliary Space**: O(1)

Please refer complete article on Delete N nodes after M nodes of a linked list for more details!