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.
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.
Python3
# Python3 program to delete every # k-th Node of a singly linked list. import math
# Linked list Node 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. def deleteKthNode(head, k):
# If linked list is empty
if (head = = None ):
return None
if (k = = 1 ):
freeList(head)
return None
# Initialize ptr and prev before
# starting traversal.
ptr = head
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
return head
# Function to print linked list def displayList(head):
temp = head
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__' :
# Start with the empty list
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)
# This code is contributed by Srathore |
Output:
1 2 4 5 7 8
Time Complexity: O(n)
Please refer complete article on Remove every k-th node of the linked list for more details!