C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

リンクリストのK番目のノードをすべて削除します


この記事では、リンクリストの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は指定されたリンクリストのサイズです。

上記のコードの説明

上記のアプローチでは、最初に現在のポインター、2番目に前のポインター、3番目に位置カウンターの3つを手元に置いています。ここで、位置カウンターが等しくなったときにノードを削除し、前のカウンターと現在のカウンターをパラメーターとして削除する関数を呼び出します。現在のノードを削除し、削除関数が実行されたらスペースを解放します。現在のポインターをにシフトします。次の要素でカウンターを1に更新し、現在がNULLになるまでこのブロックをループします。

結論

この記事では、リンクリストのk番目のノードをすべて削除する問題を解決します。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(Normal)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。この記事がお役に立てば幸いです。


  1. リンクリストの代替ノードの積

    n個のノードがある場合、タスクはリンクリスト内の代替ノードの積を出力することです。プログラムは、ノードの場所を実際に変更せずに、代替ノードの製品のみを印刷する必要があります。 例 Input -: 10 20 30 40 50 60 Output -: 15000 上記の例では、10個の代替ノードである最初のノードから開始すると10、30、50であり、それらの積は10 * 30 * 50=15000です。 上の図では、最初のノードから開始し、赤色のノードが重要ではないノードである場合、青色のノードが代替ノードです。 以下で使用するアプローチは次のとおりです 一時的なポインタを取

  2. C++でマルチレベルリンクリストをフラット化する

    この問題では、マルチレベルのリンクリストが提供されます。私たちの仕事は、マルチレベルのリンクリストをフラット化するプログラムを作成することです。 平坦化操作は、リンクリストで最初に第1レベルのノードが発生し、次に第2レベルのノードが発生するように実行されます。 マルチレベルリンクリスト は多次元データ構造であり、リンクリストのすべてのノードに2つのリンクポインタがあります。1つは次のノードへのリンクで、もう1つは1つ以上のノードを持つ子リストへのリンクです。この子ポインタは、他のリストノードを指している場合とそうでない場合があります。 例 問題を理解するために例を見てみましょう