用于删除链表的每个第 K 个节点的 C++ 程序
给定一个单链表,你的任务是删除链表的每个第 K 个节点。假设 K 总是小于或等于 Linked List 的长度。
例子 :
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
这个想法是从头开始遍历列表并跟踪上次删除后访问的节点。每当count变为k时,删除当前节点并将count重置为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.
下面是实现。
C++
// C++ program to delete every k-th
// Node of a singly linked list.
#include
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;
}
输出:
1 2 4 5 7 8
时间复杂度: O(n)
请参阅完整文章删除链表的每个第 k 个节点以获取更多详细信息!