C++ でリンク リストが空かどうかを確認する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. ルート要素を使用して C++ でリンク リストが空かどうかを確認する
  2. C++ でルート要素を使用せずにリンク リストが空かどうかを確認する
  3. C++ でルート ポイントを使用してリンク リストが空かどうかを確認する
C++ でリンク リストが空かどうかを確認する

リンク リストは配列として機能し、その実装にはポインターを使用します。 これは、配列内の任意のポイントから拡大および縮小できる動的データ構造の最も単純な例です。

リンク リストには、値とポインタを含む複数の動的に割り当てられたノードがあります。 このチュートリアルでは、リンクされたリストが C++ で空かどうかを確認する 3つの方法を説明します。

ルート要素を使用して C++ でリンク リストが空かどうかを確認する

リンクされたリストのルートは、リストが空の場合でも常に存在する要素として機能します。 リンクされたリストにルートを持つ別の用途は、最後の要素をルートにリンクしてサイクルを形成することです。

C++ では、リンクされたリストが空かどうかを確認する主な方法が 2つあります。リストの最初の要素へのポインターを提供する方法です (例: if (root->next == NULL) { /* empty list */ }) またはリンクされたリストのリスト要素をそのルートにリンクバックして循環を形成する (if (root->next == root) { /*empty list */ })。 ルート要素を使用してリンク リストが空かどうかを確認するには、データを保持しないリンク リスト ノードが少なくとも 1つ必要です。

コード例:

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

class Node {
 public:
  int data;
  Node *next;

  Node() {
    data = 0;
    next = NULL;
  }
};

class linked_list {
  Node *root;

 public:
  linked_list() { root = NULL; }

  Node *getRoot() { return root; }

  void add_node(int n) {
    Node *temp = new Node();
    temp->data = n;
    temp->next = NULL;
    if (root == NULL) {
      root = temp;
      root->next = root;
    } else {
      Node *last = root;
      while (last->next != root) {
        last = last->next;
      }
      temp->next = root;
      last->next = temp;
    }
  }

  void printList() {
    Node *temp = root;
    if (temp != NULL) {
      do {
        cout << temp->data << " ";
        temp = temp->next;
      } while (temp != root);
    }
  }

  bool isEmpty() {
    if (root->next == root && root->data == 0) return true;
    return false;
  }
};

int main() {
  linked_list l1;
  l1.add_node(5);
  l1.add_node(10);
  l1.add_node(15);

  if (l1.isEmpty())
    cout << "The list is empty!\n";
  else {
    cout << "The list is not empty! List contains:\n";
    l1.printList();
  }
  return 0;
}

出力:

The list is not empty! List contains:
5 10 15

head または root ノードは、リンクされたリスト内の開始位置を表します。 root では、常に 1つの要素があります。

C++ でルート要素を使用せずにリンク リストが空かどうかを確認する

root がない場合、リンクされたリストが空の場合、リスト ポインターは NULL になります。 このアプローチでリンクされたリストが空かどうかをチェックする複雑さは、root 要素、つまり O(1) の場合と同じです。

新しいノードを割り当てるときに、適切なデフォルト値を変数に初期化する必要があります。これにより、長さゼロのデータ メンバーを簡単に識別して、その NULL 動作を識別できるようになります。

コード例:

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

class Node {
 public:
  int data;
  Node* next;
};

void push(Node** head_ref, int new_data) {
  Node* new_node = new Node();
  new_node->data = new_data;
  new_node->next = (*head_ref);
  (*head_ref) = new_node;
}

bool isEmpty(Node** list) {
  if ((*list) == NULL) return true;
  return false;
}

void printList(Node* node) {
  while (node != NULL) {
    cout << node->data << " ";
    node = node->next;
  }
}

int main() {
  Node* list = NULL;
  if (isEmpty(&list))
    cout << "List is Empty" << endl;
  else {
    cout << "List is not empty! List contains:"
         << " ";
    printList(list);
  }
  // Inserting some elements in the list
  push(&list, 8);
  push(&list, 4);

  if (isEmpty(&list))
    cout << "The List is Empty" << endl;
  else {
    cout << "The list is not empty! The list contains:"
         << " ";
    printList(list);
  }
  return 0;
}

出力:

The List is Empty
The list is not empty! The list contains: 4 8

リンクされたリストは、ノードの next ポインターが NULL に設定されている場合にのみ適切に終了します。 リンク リストの head ポインターが NULL に設定されている場合、それは長さ 0 のリンク リストと呼ばれ、長さ 0 のリンク リストは NULL リード を表すため、空のリストでもあります。 ポインター。

C++ でルート ポイントを使用してリンク リストが空かどうかを確認する

リンク リストの最後の要素を root にリンクしてサイクルを形成すると、空のリンク リストを識別するのに役立ちます。 ルート ポイントを利用すると、次の要素として NULL を持たないなど、さまざまな利点があります。 したがって、プログラマーはこれをチェックする必要がなくなりました。

リンクされたリストの root または head がそれ自体に戻るリンクを指す場合、それは空のリンクされたリストを表すなど、いくつかのユニークなケースを提供します。 if (root->next == root) { /* 空のリスト */ } が true の場合、連結リストは空です。

疑似コード:

node *root;

... // process code (exp.)

if (root -> next == root) { /* empty list */ }

// check the head pointer - if it is NULL, there's no entry in the list.

int isEmpty( node * list )
 {
   if( !list )

      return 1;

   return 0; // otherwise in case false check
 }

C++ で変数を作成したり、ガベージ値を割り当てたりすると、データが無効化またはゼロ化される可能性があります。 変数を明示的に初期化し、それらに一意の値を割り当て、それを管理する規則を学ぶ必要があります。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

関連記事 - C++ Linked List