Delete N nodes after M nodes of a linked list - GeeksforGeeks

30 Mar, 2022
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 = 2
Linked List: 1->2->3->4->5->6->7->8
Output:
Linked List: 1->2->5->6

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

Input:
M = 1, N = 1
Linked List: 1->2->3->4->5->6->7->8->9->10
Output:
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
Java
Python3
C#
Javascript
// C++ program to delete N nodes// after M nodes of a linked list#include <bits/stdc++.h>using namespace std; // A linked list nodeclass Node{    public:    int data;    Node *next;}; /* Function to insert a node at the beginning */void push(Node ** head_ref, int new_data){    /* allocate node */    Node* new_node = new 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(Node *head){    Node *temp = head;    while (temp != NULL)    {        cout<<temp->data<<" ";        temp = temp->next;    }    cout<<endl;} // Function to skip M nodes and then// delete N nodes of the linked list.void skipMdeleteN(Node *head, int M, int N){    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++)        {            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 codeint main(){    /* Create following linked list    1->2->3->4->5->6->7->8->9->10 */    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);     cout << "M = " << M<< " N = " << N << "\nGiven Linked list is :\n";    printList(head);     skipMdeleteN(head, M, N);     cout<<"\nLinked list after deletion is :\n";    printList(head);     return 0;} // This code is contributed by rathbhupendra
// C program to delete N nodes after M nodes of a linked list#include <stdio.h>#include <stdlib.h> // A linked list nodestruct 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("\n");} // 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);        }        curr->next = t; // Link the previous list with remaining nodes         // Set current pointer for next iteration        curr = t;    }} // Driver program to test above functionsint 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 \nGiven Linked list is :\n", M, N);    printList(head);     skipMdeleteN(head, M, N);     printf("\nLinked list after deletion is :\n");    printList(head);     return 0;}
// Java program to delete N nodes// after M nodes of a linked listimport java.util.*; class GFG{ // A linked list nodestatic class Node{    int data;    Node next;}; /* Function to insert a node at the beginning */static Node push( Node head_ref, int new_data){    /* allocate node */    Node new_node = new 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;         return head_ref;} /* Function to print linked list */static void printList( Node head){    Node temp = head;    while (temp != null)    {        System.out.printf("%d ", temp.data);        temp = temp.next;    }    System.out.printf("\n");} // Function to skip M nodes and then// delete N nodes of the linked list.static void skipMdeleteN( Node head, int M, int N){    Node curr = head, t;    int count;     // The main loop that traverses    // through the whole list    while (curr!=null)    {        // 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++)        {            Node temp = t;            t = t.next;        }                 // Link the previous list with remaining nodes        curr.next = t;         // Set current pointer for next iteration        curr = t;    }} // Driver codepublic static void main(String args[]){    /* Create following linked list    1.2.3.4.5.6.7.8.9.10 */    Node head = null;    int M=2, N=3;    head=push(head, 10);    head=push(head, 9);    head=push(head, 8);    head=push(head, 7);    head=push(head, 6);    head=push(head, 5);    head=push(head, 4);    head=push(head, 3);    head=push(head, 2);    head=push(head, 1);     System.out.printf("M = %d, N = %d \nGiven" +                        "Linked list is :\n", M, N);    printList(head);     skipMdeleteN(head, M, N);     System.out.printf("\nLinked list after deletion is :\n");    printList(head);}} // This code is contributed by Arnab Kundu
# Python program to delete M nodes after N nodes # Node classclass Node:     # Constructor to initialize the node object    def __init__(self, data):        self.data = data        self.next = None class LinkedList:     # Function to initialize head    def __init__(self):        self.head = None     # Function to insert a new node at the beginning    def push(self, new_data):        new_node = Node(new_data)        new_node.next = self.head        self.head = new_node     # Utility function to print the linked LinkedList    def printList(self):        temp = self.head        while(temp):            print (temp.data,end=" ")            temp = temp.next     def skipMdeleteN(self, M, N):        curr = self.head                 # The main loop that traverses through the        # whole list        while(curr):            # Skip M nodes            for count in range(1, M):                if curr is None:                    return                curr = curr.next                                 if curr is None :                return             # Start from next node and delete N nodes            t = curr.next            for count in range(1, N+1):                if t is None:                    break                t = t.next                 # Link the previous list with remaining nodes            curr.next = t            # Set Current pointer for next iteration            curr = t # Driver program to test above function # Create following linked list# 1->2->3->4->5->6->7->8->9->10llist = LinkedList()M = 2N = 3llist.push(10)llist.push(9)llist.push(8)llist.push(7)llist.push(6)llist.push(5)llist.push(4)llist.push(3)llist.push(2)llist.push(1) print ("M = %d, N = %d\nGiven Linked List is:" %(M, N))llist.printList()print() llist.skipMdeleteN(M, N) print ("\nLinked list after deletion is")llist.printList() # This code is contributed by Nikhil Kumar Singh(nickzuck_007)
// C# program to delete N nodes// after M nodes of a linked listusing System; class GFG{ // A linked list nodepublic class Node{    public int data;    public Node next;}; /* Function to insert a node at the beginning */static Node push( Node head_ref, int new_data){    /* allocate node */    Node new_node = new 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;         return head_ref;} /* Function to print linked list */static void printList( Node head){    Node temp = head;    while (temp != null)    {        Console.Write("{0} ", temp.data);        temp = temp.next;    }    Console.Write("\n");} // Function to skip M nodes and then// delete N nodes of the linked list.static void skipMdeleteN( Node head, int M, int N){    Node curr = head, t;    int count;     // The main loop that traverses    // through the whole list    while (curr!=null)    {        // 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++)        {            Node temp = t;            t = t.next;        }                 // Link the previous list with remaining nodes        curr.next = t;         // Set current pointer for next iteration        curr = t;    }} // Driver codepublic static void Main(String []args){    /* Create following linked list    1.2.3.4.5.6.7.8.9.10 */    Node head = null;    int M=2, N=3;    head=push(head, 10);    head=push(head, 9);    head=push(head, 8);    head=push(head, 7);    head=push(head, 6);    head=push(head, 5);    head=push(head, 4);    head=push(head, 3);    head=push(head, 2);    head=push(head, 1);     Console.Write("M = {0}, N = {1} \nGiven" +                        "Linked list is :\n", M, N);    printList(head);     skipMdeleteN(head, M, N);     Console.Write("\nLinked list after deletion is :\n");    printList(head);}} // This code contributed by Rajput-Ji
<script> // Javascript program to delete N nodes// after M nodes of a linked list     // A linked list nodeclass Node {    constructor() {        this.data = 0;        this.next = null;    }}     /* Function to insert a node at the beginning */    function push(head_ref , new_data) {        /* allocate node */var new_node = new 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;         return head_ref;    }     /* Function to print linked list */    function printList(head) {var temp = head;        while (temp != null) {            document.write(temp.data+" ");            temp = temp.next;        }        document.write("<br/>");    }     // Function to skip M nodes and then    // delete N nodes of the linked list.    function skipMdeleteN(head , M , N) {var curr = head, t;        var count;         // The main loop that traverses        // through the whole list        while (curr != null) {            // 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++)            {        var temp = t;                t = t.next;            }             // Link the previous list with remaining nodes            curr.next = t;             // Set current pointer for next iteration            curr = t;        }    }     // Driver code             /*          Create following linked list         1.2.3.4.5.6.7.8.9.10         */var head = null;        var M = 2, N = 3;        head = push(head, 10);        head = push(head, 9);        head = push(head, 8);        head = push(head, 7);        head = push(head, 6);        head = push(head, 5);        head = push(head, 4);        head = push(head, 3);        head = push(head, 2);        head = push(head, 1);         document.write(        "M = "+M+", N = "+N+"<br/>Given Linked list is :<br/>"        );        printList(head);         skipMdeleteN(head, M, N);         document.write(        "<br/>Linked list after deletion is :<br/>"        );        printList(head); // This code contributed by gauravrajput1 </script>
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) 
YouTubeGeeksforGeeks507K subscribersDelete N nodes after M nodes of a linked list | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 8:36•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=PpY_C_NSNwk" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
This article is contributed by Chandra Prakash. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
AbhishekValsan
andrew1234
Rajput-Ji
rathbhupendra
GauravRajput1
anikaseth98
anikakapoor
simranarora5sos
amartyaghoshgfg
rohan07
Amazon
Microsoft
Linked List
Amazon
Microsoft
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
LinkedList in Java
Linked List vs Array
Doubly Linked List | Set 1 (Introduction and Insertion)
Delete a Linked List node at a given position
Implement a stack using singly linked list
Queue - Linked List Implementation
Implementing a Linked List in Java using Class
Circular Linked List | Set 1 (Introduction and Applications)
Remove duplicates from a sorted linked list
Function to check if a singly linked list is palindrome