Remove every k-th node of the linked list

• Difficulty Level : Easy
• Last Updated : 15 Nov, 2021

Given a singly linked list, Your task is to remove every K-th node of the linked list. Assume that K is always less than or equal to length of Linked List.
Examples :

Input : 1->2->3->4->5->6->7->8
k = 3
Output : 1->2->4->5->7->8
As 3 is the k-th node after its deletion list
would be 1->2->4->5->6->7->8
And now 4 is the starting node then from it, 6
would be the k-th node. So no other kth node
could be there.So, final list is:
1->2->4->5->7->8.

Input: 1->2->3->4->5->6
k = 1
Output: Empty list
All nodes need to be deleted

Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

The idea is to traverse the list from the beginning and keep track of nodes visited after the last deletion. Whenever count becomes k, delete the current node and reset the count as 0.

(1) Traverse list and do following
(a) Count node before deletion.
(b) If (count == k) that means current
node is to be deleted.
(i)  Delete current node i.e. do

//  assign address of next node of
// current node to the previous node
// of the current node.
prev->next = ptr->next i.e.

(ii) Reset count as 0, i.e., do count = 0.
(c) Update prev node if count != 0 and if
count is 0 that means that node is a
starting point.
(d) Update ptr and continue until all
k-th node gets deleted.

Below is the implementation.

C++

// C++ program to delete every k-th Node of
#include<bits/stdc++.h>
using namespace std;

struct Node
{
int data;
struct Node* next;
};

// To remove complete list (Needed for
// case when k is 1)
void freeList(Node *node)
{
while (node != NULL)
{
Node *next = node->next;
delete (node);
node  = next;
}
}

// Deletes every k-th node and returns head
// of modified list.
Node *deleteKthNode(struct Node *head, int k)
{
// If linked list is empty
return NULL;

if (k == 1)
{
return NULL;
}

// Initialize ptr and prev before starting
// traversal.
struct Node *ptr = head, *prev = NULL;

// Traverse list and delete every k-th node
int count = 0;
while (ptr != NULL)
{
// increment Node count
count++;

// check if count is equal to k
// if yes, then delete current Node
if (k == count)
{
// put the next of current Node in
// the next of previous Node
delete(prev->next);
prev->next = ptr->next;

// set count = 0 to reach further
// k-th Node
count = 0;
}

// update prev if count is not 0
if (count != 0)
prev = ptr;

ptr = prev->next;
}

}

/* Function to print linked list */
{
while (temp != NULL)
{
cout<<temp->data<<" ";
temp = temp->next;
}
}

// Utility function to create a new node.
struct Node *newNode(int x)
{
Node *temp = new Node;
temp->data = x;
temp->next = NULL;
return temp;
}

/* Driver program to test count function*/
int main()
{
newNode(7);
newNode(8);

int k = 3;

return 0;
}

Java

// Java program to delete every k-th Node
// of a singly linked list.
class GFG
{

static class Node
{
int data;
Node next;
}

// To remove complete list (Needed for
// case when k is 1)
static Node freeList(Node node)
{
while (node != null)
{
Node next = node.next;
node = next;
}
return node;
}

// Deletes every k-th node and
// returns head of modified list.
static Node deleteKthNode(Node head, int k)
{
// If linked list is empty
return null;

if (k == 1)
{
return null;
}

// Initialize ptr and prev before
// starting traversal.
Node ptr = head, prev = null;

// Traverse list and delete
// every k-th node
int count = 0;
while (ptr != null)
{
// increment Node count
count++;

// check if count is equal to k
// if yes, then delete current Node
if (k == count)
{
// put the next of current Node in
// the next of previous Node
prev.next = ptr.next;

// set count = 0 to reach further
// k-th Node
count = 0;
}

// update prev if count is not 0
if (count != 0)
prev = ptr;

ptr = prev.next;
}
}

/* Function to print linked list */
{
while (temp != null)
{
System.out.print(temp.data + " ");
temp = temp.next;
}
}

// Utility function to create a new node.
static Node newNode(int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null;
return temp;
}

// Driver Code
public static void main(String args[])
{
newNode(7);
newNode(8);

int k = 3;

}
}

// This code is contributed by Arnab Kundu

Python3

# Python3 program to delete every k-th Node
# of a singly linked list.
import math

class Node:
def __init__(self, data):
self.data = data
self.next = None

# To remove complete list (Needed for
# case when k is 1)
def freeList(node):
while (node != None):
next = node.next
node = next
return node

# Deletes every k-th node and
# returns head of modified list.

# If linked list is empty
return None

if (k == 1):
return None

# Initialize ptr and prev before
# starting traversal.
prev = None

# Traverse list and delete every k-th node
count = 0
while (ptr != None):

# increment Node count
count = count + 1

# check if count is equal to k
# if yes, then delete current Node
if (k == count):

# put the next of current Node in
# the next of previous Node
# delete(prev.next)
prev.next = ptr.next

# set count = 0 to reach further
# k-th Node
count = 0

# update prev if count is not 0
if (count != 0):
prev = ptr

ptr = prev.next

# Function to print linked list
while (temp != None):
print(temp.data, end = ' ')
temp = temp.next

# Utility function to create a new node.
def newNode( x):
temp = Node(x)
temp.data = x
temp.next = None
return temp

# Driver Code
if __name__=='__main__':

k = 3

# This code is contributed by Srathore

C#

// C# program to delete every k-th Node
// of a singly linked list.
using System;

class GFG
{

public class Node
{
public int data;
public Node next;
}

// To remove complete list (Needed for
// case when k is 1)
static Node freeList(Node node)
{
while (node != null)
{
Node next = node.next;
node = next;
}
return node;
}

// Deletes every k-th node and
// returns head of modified list.
static Node deleteKthNode(Node head, int k)
{
// If linked list is empty
return null;

if (k == 1)
{
return null;
}

// Initialize ptr and prev before
// starting traversal.
Node ptr = head, prev = null;

// Traverse list and delete
// every k-th node
int count = 0;
while (ptr != null)
{
// increment Node count
count++;

// check if count is equal to k
// if yes, then delete current Node
if (k == count)
{
// put the next of current Node in
// the next of previous Node
prev.next = ptr.next;

// set count = 0 to reach further
// k-th Node
count = 0;
}

// update prev if count is not 0
if (count != 0)
prev = ptr;

ptr = prev.next;
}
}

/* Function to print linked list */
{
while (temp != null)
{
Console.Write(temp.data + " ");
temp = temp.next;
}
}

// Utility function to create a new node.
static Node newNode(int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null;
return temp;
}

// Driver Code
public static void Main(String []args)
{

int k = 3;

}
}

// This code is contributed by PrinciRaj1992

Javascript

<script>

// Javascript program to delete every k-th Node
// of a singly linked list.
class Node {
constructor() {
this.data = 0;
this.next = null;
}
}

// To remove complete list (Needed for
// case when k is 1)
function freeList( node) {
while (node != null) {
next = node.next;
node = next;
}
return node;
}

// Deletes every k-th node and
// returns head of modified list.
function deleteKthNode( head , k) {
// If linked list is empty
return null;

if (k == 1) {
return null;
}

// Initialize ptr and prev before
// starting traversal.
var ptr = head, prev = null;

// Traverse list and delete
// every k-th node
var count = 0;
while (ptr != null) {
// increment Node count
count++;

// check if count is equal to k
// if yes, then delete current Node
if (k == count) {
// put the next of current Node in
// the next of previous Node
prev.next = ptr.next;

// set count = 0 to reach further
// k-th Node
count = 0;
}

// update prev if count is not 0
if (count != 0)
prev = ptr;

ptr = prev.next;
}
}

/* Function to print linked list */
while (temp != null) {
document.write(temp.data + " ");
temp = temp.next;
}
}

// Utility function to create a new node.
function newNode(x) {
temp = new Node();
temp.data = x;
temp.next = null;
return temp;
}

// Driver Code

var k = 3;

// This code contributed by umadevi9616

</script>

Output:

1 2 4 5 7 8

Time Complexity : O(n)

This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.