在本文中,我們將解釋如何刪除鍊錶中的每個第k個節點。我們必須刪除位於k的倍數上的每個節點,也就是我們必須刪除位置為k、2*k、3*k等的節點。
Input : 112->231->31->41->54->63->71->85 k = 3 Output : 112->231->41->54->71->85 Explanation: As 3 is the k-th node after its deletion list would be : First iteration :112->231->41->54->63->71->85 Now we count from 41 the next kth node is 63 After the second iteration our list will become : 112->231->41->54->71->85 And our iteration continues like this. Input: 14->21->23->54->56->61 k = 1 Output: Empty list Explanation: All nodes need to be deleted
在這個問題中,我們將應用一種足夠有效的普通方法,因此我們不需要對其進行最佳化。
在此問題中,我們將用計數器遍歷鍊錶。如果計數器達到 k,我們刪除該節點並刷新計數器以查找當前節點第 k 個位置的下一個元素。
#include<bits/stdc++.h> using namespace std; /* Linked list Node */ struct Node { int data; struct Node* next; }; void push(struct Node** ref, int new_data) { // pushing the data into the list struct Node* new_n = new Node; new_n->data = new_data; new_n->next = (*ref); (*ref) = new_n; } void deletek(Node* prev, Node* curr) { // delete function if(prev == NULL) { prev = curr; curr = curr -> next; free(prev); prev = NULL; } else { prev -> next = curr -> next; auto tmp = curr; free(tmp); // freeing the space } } /* Function to print linked list */ void displayList(struct Node *head) { struct Node *temp = head; while (temp != NULL) { cout<<temp->data<<" "; temp = temp->next; } } // Function to create a new node. struct Node *newNode(int x) { Node *temp = new Node; temp->data = x; temp->next = NULL; return temp; } int main() { struct Node* head = NULL; push(&head, 80); push(&head, 70); push(&head, 60); push(&head, 50); push(&head, 40); push(&head, 30); push(&head, 20); int k = 3; // given k Node* curr = head; // current pointer Node* prev = NULL; // previous pointer int count = 1; // position counter if(head == NULL || k == 0) // if list is already empty or k = 0 cout << "Invalid\n"; else { while(curr) { // traversing the list if(count == k) { deletek(prev, curr); curr = prev -> next; count = 1; } else { count++; prev = curr; curr = curr -> next; } } displayList(head); // printing the new list } return 0; }
20 30 50 60 80
上述方法的時間複雜度為O(N),其中N是給定鍊錶的大小。
在上述方法中,我們先保留三個東西,第一個是目前指針,第二個是前一個指針,第三個是位置計數器。現在當我們的位置計數器等於k時,我們刪除某個節點,呼叫刪除函數並將前一個和當前計數器作為參數傳遞,然後我們刪除當前節點並釋放空間,當刪除函數完成後,我們將當前指標移動到下一個元素,並將計數器刷新為1,循環此區塊直到目前指標變為NULL。
在本文中,我們解決了一個問題,即刪除鍊錶的每個第k個節點。我們也學習了解決此問題的C 程序和完整的(普通)方法。我們可以使用其他語言(如C、Java、Python和其他語言)編寫相同的程式。希望您會發現本文有幫助。
以上是刪除鍊錶中的每個第K個節點的詳細內容。更多資訊請關注PHP中文網其他相關文章!