Open In App

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

Last Updated : 30 Mar, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

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++ program to delete N nodes
// after M nodes of a linked list 
#include <bits/stdc++.h>
using namespace std;

// A linked list node 
class 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 code 
int 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 << "Given Linked list is :"; 
    printList(head); 

    skipMdeleteN(head, M, N); 

    cout<<"Linked list after deletion is :"; 
    printList(head); 

    return 0; 
} 
// This code is contributed by rathbhupendra

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!


Next Article

Similar Reads