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

C++で連結リストが循環リンクリストかどうかを判定する方法

この記事では、連結リスト(リンクリスト)が循環リンクリストであるかどうかを判定する方法を解説します。

循環リンクリストの判定アルゴリズム

連結リストが循環しているかどうかを確認するには、以下の手順を実行します。

  1. 先頭ノード(ヘッダーノード)へのポインタを別の変数に保存しておきます。
  2. リストを順番に走査していきます。
  3. 走査中に、あるノードのnextがNULLになった場合はリストの終端に到達したことを意味するため、循環リンクリストではありません
  4. 逆に、走査中のノードが最初に保存しておいた先頭ノードと一致した場合は、リストが一周して元の位置に戻ったことを意味するため、循環リンクリストです

C++での実装例

#include <iostream>
using namespace std;
class Node{
    public:
    int data;
    Node *next;
};
Node* getNode(int data){
    Node *newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}
bool isCircularList(Node *start){
    if(start == NULL)
        return true;
    Node *node = start->next;
    while(node != NULL && node != start){
        node = node->next;
    }
    if(node == start)
        return true;
    return false;
}
int main() {
    Node *start = getNode(10);
    start->next = getNode(20);
    start->next->next = getNode(30);
    start->next->next->next = getNode(40);
    start->next->next->next->next = getNode(50);
    start->next->next->next->next->next = start;
    if (isCircularList(start))
        cout << "The list is circular list";
    else
        cout << "The list is not circular list";
}

コードの解説

isCircularList関数では、まずリストが空(NULL)の場合にtrueを返します。次に、start->nextから走査を開始し、ノードがNULLになるか、先頭ノードに戻るまでループを繰り返します。ループ終了時にノードが先頭ノードと一致していれば循環リンクリスト、一致しなければ通常の連結リストと判定できます。このアルゴリズムの時間計算量はO(n)、空間計算量はO(1)であり、非常に効率的です。

出力結果

The list is circular list

  1. 【C++】循環リンクリストのノード値の合計を求める方法

    この記事では、循環リンクリスト(Circular Linked List)が与えられたときに、すべてのノードの値の合計を求めるプログラムをC++で作成する方法を解説します。 やるべきことはシンプルで、リンクリストを構成する全ノードの値を順番に読み取り、それらを加算していくだけです。 前提知識:重要な定義 リンクリストとは リンクリスト(連結リスト)とは、各データ(ノード)をポインタによるリンクで相互に接続したデータ構造の列です。配列と異なり、メモリ上の連続した領域を必要とせず、動的な挿入や削除に強いという特徴があります。 循環リンクリストとは 循環リンクリストはリンクリストの変形の一種で、先

  2. C++で循環リンクリストのノード数をカウントする方法

    ノードから構成される循環リンクリスト(Circular Linked List)が与えられ、そのリスト内に存在するノードの総数を求めるのが課題です。 循環リンクリストとは、連結リストの一種であり、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すという特徴を持つデータ構造です。片方向リンクリスト(Singly Linked List)でも双方向リンクリスト(Doubly Linked List)でも、この循環リンクリストとして実装することが可能です。 以下のプログラムでは、片方向リンクリストを循環リンクリストとして実装し、その中に含まれるノード数をカウントする方法を紹介します。 具体