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, and 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.
Implementation:
// 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 of 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 << "\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 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 of 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 functions 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 \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 list import java.util.*;
class GFG
{ // A linked list node static 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 of 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 code public 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 class class 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->10 llist = LinkedList()
M = 2 N = 3
llist.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 list using System;
class GFG
{ // A linked list node public 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 of 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 code public 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 node
class 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 of 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> |
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)