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

C++のリンクリストでループの長さを見つける


この問題では、ループを含む可能性のあるリンクリストが表示されます。私たちのタスクは、リンクリストでループの長さを見つけることです。

問題の説明: ループが含まれている場合はループ内のノード数をカウントする必要があります。それ以外の場合は-1を返します。

問題を理解するために例を見てみましょう。

入力: リンクリスト:

C++のリンクリストでループの長さを見つける

出力: 8

ソリューションアプローチ

この問題を解決するには、まずリンクリストにループが含まれているかどうかを確認する必要があります。これを確認するためのアプローチは、フロイドの循環検出アルゴリズムを使用することです。

フロイドの循環検出アルゴリズムでは、 2つのポインタを使用してリンクリストをトラバースします。 1つのslowPointer これは1つ増え、もう1つは fastPointer ある時点で両方の数値が一致する場合はループが存在し、そうでない場合はループが存在しません。

ループが存在する場合は、ループ内に存在するノードの数を数える必要があります。このために、 slowPointerのポイントから開始します。 およびfastPointer 会ってから、その位置に戻るために通過したノードの数を数えます。

ソリューションの動作を説明するプログラム

#include<bits/stdc++.h>
using namespace std;

struct Node {
   int data;
   struct Node* next;
};

int countLoopNodespoint(struct Node *n) {
   int res = 1;
   struct Node *temp = n;
   while (temp->next != n) {
     
      res++;
      temp = temp->next;
   }
   return res;
}

int countLoopNode(struct Node *list) {
   
   struct Node *slowPtr = list, *fastPtr = list;
   while (slowPtr && fastPtr && fastPtr->next) {
      slowPtr = slowPtr->next;
      fastPtr = fastPtr->next->next;

      if (slowPtr == fastPtr)
         return countLoopNodespoint(slowPtr);
   }
   return 0;
}

struct Node *newNode(int key) {
   struct Node *temp = (struct Node*)malloc(sizeof(struct Node));
   temp->data = key;
   temp->next = NULL;
   return temp;
}

int main() {
   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 = head->next;

   cout<<"The number of nodes in the loop are "<<countLoopNode(head);

   return 0;
}

出力

The number of nodes in the loop are 6>]

  1. C++でのリンクリストのフラット化

    この問題では、右と下の2つのポインタノードで構成されるリンクリストが表示されます。 右ノード はメインのリンクリストポインタです。 ダウンノード そのノードで始まるセカンダリリンクリスト用です。 リンクリストはすべて並べ替えられています。 私たちのタスクは、リンクリストをフラット化するプログラムを作成することであり、結果のリスト自体がソートされたリストになります。 問題を理解するために例を見てみましょう 入力 出力 1-> 9-> 8 -> 4 -> 6-> 7-> 2-> 3-> 5 ソリューションアプロー

  2. C++で二重リンクリストのサイズを見つけるプログラム

    この問題では、二重にリンクされたリストが与えられます。私たちのタスクは、C++で二重リンクリストのサイズを見つけるプログラムを作成することです。 二重リンクリストは特殊なタイプのリンクリストであり、単一リンクリストと比較して、順方向と逆方向の両方の方法で簡単にナビゲーションできます。以下は、二重リンクリストの概念を理解するための重要な用語です。 リンク-リンクリストの各リンクには、要素と呼ばれるデータを格納できます。 次へ-リンクリストの各リンクには、次と呼ばれる次のリンクへのリンクが含まれています。 前-リンクリストの各リンクには、前と呼ばれる前のリンクへのリンクが含ま