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
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++
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int data;
struct Node* next;
};
void freeList(Node *node)
{
while (node != NULL)
{
Node *next = node->next;
delete (node);
node = next;
}
}
Node *deleteKthNode( struct Node *head, int k)
{
if (head == NULL)
return NULL;
if (k == 1)
{
freeList(head);
return NULL;
}
struct Node *ptr = head, *prev = NULL;
int count = 0;
while (ptr != NULL)
{
count++;
if (k == count)
{
delete (prev->next);
prev->next = ptr->next;
count = 0;
}
if (count != 0)
prev = ptr;
ptr = prev->next;
}
return head;
}
void displayList( struct Node *head)
{
struct Node *temp = head;
while (temp != NULL)
{
cout<<temp->data<< " " ;
temp = temp->next;
}
}
struct Node *newNode( int x)
{
Node *temp = new Node;
temp->data = x;
temp->next = NULL;
return temp;
}
int main()
{
struct Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
head->next->next->next->next = newNode(5);
head->next->next->next->next->next = newNode(6);
head->next->next->next->next->next->next =
newNode(7);
head->next->next->next->next->next->next->next =
newNode(8);
int k = 3;
head = deleteKthNode(head, k);
displayList(head);
return 0;
}
|
Java
class GFG
{
static class Node
{
int data;
Node next;
}
static Node freeList(Node node)
{
while (node != null )
{
Node next = node.next;
node = next;
}
return node;
}
static Node deleteKthNode(Node head, int k)
{
if (head == null )
return null ;
if (k == 1 )
{
head = freeList(head);
return null ;
}
Node ptr = head, prev = null ;
int count = 0 ;
while (ptr != null )
{
count++;
if (k == count)
{
prev.next = ptr.next;
count = 0 ;
}
if (count != 0 )
prev = ptr;
ptr = prev.next;
}
return head;
}
static void displayList(Node head)
{
Node temp = head;
while (temp != null )
{
System.out.print(temp.data + " " );
temp = temp.next;
}
}
static Node newNode( int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null ;
return temp;
}
public static void main(String args[])
{
Node head = newNode( 1 );
head.next = newNode( 2 );
head.next.next = newNode( 3 );
head.next.next.next = newNode( 4 );
head.next.next.next.next = newNode( 5 );
head.next.next.next.next.next = newNode( 6 );
head.next.next.next.next.next.next =
newNode( 7 );
head.next.next.next.next.next.next.next =
newNode( 8 );
int k = 3 ;
head = deleteKthNode(head, k);
displayList(head);
}
}
|
Python3
import math
class Node:
def __init__( self , data):
self .data = data
self . next = None
def freeList(node):
while (node ! = None ):
next = node. next
node = next
return node
def deleteKthNode(head, k):
if (head = = None ):
return None
if (k = = 1 ):
freeList(head)
return None
ptr = head
prev = None
count = 0
while (ptr ! = None ):
count = count + 1
if (k = = count):
prev. next = ptr. next
count = 0
if (count ! = 0 ):
prev = ptr
ptr = prev. next
return head
def displayList(head):
temp = head
while (temp ! = None ):
print (temp.data, end = ' ' )
temp = temp. next
def newNode( x):
temp = Node(x)
temp.data = x
temp. next = None
return temp
if __name__ = = '__main__' :
head = newNode( 1 )
head. next = newNode( 2 )
head. next . next = newNode( 3 )
head. next . next . next = newNode( 4 )
head. next . next . next . next = newNode( 5 )
head. next . next . next . next . next = newNode( 6 )
head. next . next . next . next . next . next = newNode( 7 )
head. next . next . next . next . next . next . next = newNode( 8 )
k = 3
head = deleteKthNode(head, k)
displayList(head)
|
C#
using System;
class GFG
{
public class Node
{
public int data;
public Node next;
}
static Node freeList(Node node)
{
while (node != null )
{
Node next = node.next;
node = next;
}
return node;
}
static Node deleteKthNode(Node head, int k)
{
if (head == null )
return null ;
if (k == 1)
{
head = freeList(head);
return null ;
}
Node ptr = head, prev = null ;
int count = 0;
while (ptr != null )
{
count++;
if (k == count)
{
prev.next = ptr.next;
count = 0;
}
if (count != 0)
prev = ptr;
ptr = prev.next;
}
return head;
}
static void displayList(Node head)
{
Node temp = head;
while (temp != null )
{
Console.Write(temp.data + " " );
temp = temp.next;
}
}
static Node newNode( int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null ;
return temp;
}
public static void Main(String []args)
{
Node head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
head.next.next.next.next = newNode(5);
head.next.next.next.next.next = newNode(6);
head.next.next.next.next.next.next = newNode(7);
head.next.next.next.next.next.next.next = newNode(8);
int k = 3;
head = deleteKthNode(head, k);
displayList(head);
}
}
|
Javascript
<script>
class Node {
constructor() {
this .data = 0;
this .next = null ;
}
}
function freeList( node) {
while (node != null ) {
next = node.next;
node = next;
}
return node;
}
function deleteKthNode( head , k) {
if (head == null )
return null ;
if (k == 1) {
head = freeList(head);
return null ;
}
var ptr = head, prev = null ;
var count = 0;
while (ptr != null ) {
count++;
if (k == count) {
prev.next = ptr.next;
count = 0;
}
if (count != 0)
prev = ptr;
ptr = prev.next;
}
return head;
}
function displayList( head) {
temp = head;
while (temp != null ) {
document.write(temp.data + " " );
temp = temp.next;
}
}
function newNode(x) {
temp = new Node();
temp.data = x;
temp.next = null ;
return temp;
}
head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
head.next.next.next.next = newNode(5);
head.next.next.next.next.next = newNode(6);
head.next.next.next.next.next.next = newNode(7);
head.next.next.next.next.next.next.next = newNode(8);
var k = 3;
head = deleteKthNode(head, k);
displayList(head);
</script>
|
Time Complexity : O(n)
Auxiliary Space : O(1)
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.