C++ Program For Removing Every K-th Node Of The Linked List
Last Updated :
10 Jan, 2022
Improve
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.
// C++ program to delete every k-th
// Node of a singly linked list.
#include<bits/stdc++.h>
using namespace std;
// Linked list Node
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
if (head == NULL)
return NULL;
if (k == 1)
{
freeList(head);
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;
}
return head;
}
// Function to print linked list
void displayList(struct Node *head)
{
struct Node *temp = head;
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 code
int main()
{
// Start with the empty list
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;
}
120
1
// C++ program to delete every k-th
2
// Node of a singly linked list.
3
4
using namespace std;
5
6
// Linked list Node
7
struct Node
8
{
9
int data;
10
struct Node* next;
11
};
12
13
// To remove complete list (Needed
14
// for case when k is 1)
15
void freeList(Node *node)
16
{
17
while (node != NULL)
18
{
19
Node *next = node->next;
20
delete (node);
21
node = next;
22
}
23
}
24
25
// Deletes every k-th node and returns head
26
// of modified list.
27
Node *deleteKthNode(struct Node *head,
28
int k)
29
{
30
// If linked list is empty
31
if (head == NULL)
32
return NULL;
33
34
if (k == 1)
35
{
36
freeList(head);
37
return NULL;
38
}
39
40
// Initialize ptr and prev before
41
// starting traversal.
42
struct Node *ptr = head, *prev = NULL;
43
44
// Traverse list and delete every
45
// k-th node
46
int count = 0;
47
while (ptr != NULL)
48
{
49
// Increment Node count
50
count++;
51
52
// Check if count is equal to k
53
// if yes, then delete current Node
54
if (k == count)
55
{
56
// Put the next of current Node in
57
// the next of previous Node
58
delete(prev->next);
59
prev->next = ptr->next;
60
61
// Set count = 0 to reach further
62
// k-th Node
63
count = 0;
64
}
65
66
// Update prev if count is not 0
67
if (count != 0)
68
prev = ptr;
69
70
ptr = prev->next;
71
}
72
73
return head;
74
}
75
76
// Function to print linked list
77
void displayList(struct Node *head)
78
{
79
struct Node *temp = head;
80
while (temp != NULL)
81
{
82
cout << temp->data << " ";
83
temp = temp->next;
84
}
85
}
86
87
// Utility function to create
88
// a new node.
89
struct Node *newNode(int x)
90
{
91
Node *temp = new Node;
92
temp->data = x;
93
temp->next = NULL;
94
return temp;
95
}
96
97
// Driver code
98
int main()
99
{
100
// Start with the empty list
101
struct Node* head = newNode(1);
102
head->next = newNode(2);
103
head->next->next = newNode(3);
104
head->next->next->next = newNode(4);
105
head->next->next->next->next =
106
newNode(5);
107
head->next->next->next->next->next =
108
newNode(6);
109
head->next->next->next->next->next->next =
110
newNode(7);
111
head->next->next->next->next->next->next->next =
112
newNode(8);
113
114
int k = 3;
115
head = deleteKthNode(head, k);
116
117
displayList(head);
118
119
return 0;
120
}
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!