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

循環リンクリスト内の要素を検索するPythonプログラム

循環リンクリストとは

循環リンクリスト(Circular Linked List)は、通常のリンクリストと異なり、最後のノードが先頭ノードに接続されているデータ構造です。そのため、リスト内に「NULL」で終わるノードが存在せず、head(先頭)とtail(末尾)が互いに隣接し、円を形成するように連結されています。

循環リンクリスト内の特定の要素を検索するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納されるデータと、次のノードへの参照という2つの属性を持たせます。

さらに、初期化関数を持つ別のクラスを作成し、headノードを「None」で初期化します。そして、リストへのノード追加、特定ノードの検索、ノード値の出力を行うための複数のメソッドを定義します。

サンプルコード

以下は、循環リンクリスト内の要素を検索するPythonプログラムの実装例です。

class Node:
   def __init__(self,data):
      self.data = data
      self.next = None
class list_creation:
   def __init__(self):
      self.head = Node(None)
      self.tail = Node(None)
      self.head.next = self.tail
      self.tail.next = self.head
   def add_data(self,my_data):
      new_node = Node(my_data)
      if self.head.data is None:
         self.head = new_node
         self.tail = new_node
         new_node.next = self.head
      else:
         self.tail.next = new_node
         self.tail = new_node
         self.tail.next = self.head
   def search_value(self,elem_to_search):
      curr = self.head;
      i = 1;
      flag_val = False;
      if(self.head == None):
         print("The list is empty");
      else:
         while(True):
            if(curr.data == elem_to_search):
               flag_val = True;
               break;
            curr = curr.next;
            i = i + 1;
            if(curr == self.head):
               break;
         if(flag_val):
            print("The element is present in list at position : " + str(i));
         else:
            print("The element is not present in list");
   def print_it(self):
      curr = self.head
      if self.head is None:
         print("The list is empty");
         return;
      else:
         print(curr.data)
         while(curr.next != self.head):
            curr = curr.next
            print(curr.data)
         print("\n")
class circular_linked_list:
   my_cl = list_creation()
   print("Nodes are being added to the list")
   my_cl.add_data(21)
   my_cl.add_data(54)
   my_cl.add_data(78)
   my_cl.add_data(99)
   my_cl.add_data(27)
   print("The list is :")
   my_cl.print_it()
   print("Value 99 is being searched")
   my_cl.search_value(99)
   print("Value 0 is being searched")
   my_cl.search_value(0)

出力結果

Nodes are being added to the list
The list is :
21
54
78
99
27
Value 99 is being searched
The element is present in list at position : 4
Value 0 is being searched
The element is not present in list

コードの解説

  • まず、「Node」クラスを作成します。このクラスには、ノードのデータ(data)と次のノードへの参照(next)が含まれます。
  • 次に、必要な属性を持つ「list_creation」クラスを作成します。__init__メソッドでは、循環リンクリストの最初と最後のノードをNoneで初期化します。
  • 「add_data」メソッドは、新しいノードをリストの末尾に追加します。最初のノードの場合はheadとtailの両方に設定され、それ以降はtailの後ろに接続されます。
  • 「search_value」メソッドは、リンクリスト内の特定の要素を検索するために定義されたメソッドです。リストを先頭から順に走査し、検索対象の要素が見つかったかどうかを確認します。
  • 要素が見つかった場合は、その位置(インデックス)が出力されます。最後まで見つからなかった場合は、要素が存在しないことを示すメッセージが表示されます。
  • 「print_it」メソッドは、循環リンクリストのすべてのノードの値を表示します。curr.nextがheadに戻るまでループを続けることで、無限ループを防ぎながら全ノードを出力できます。
  • 「list_creation」クラスのオブジェクトを作成し、add_dataメソッドを使って21、54、78、99、27の5つの値を順番に追加します。
  • 最後に「search_value」メソッドを呼び出して、値99と値0の検索を実行します。99は4番目の位置に存在するため位置が出力され、0は存在しないため該当なしのメッセージが表示されます。

まとめ

このプログラムでは、循環リンクリストの基本的な操作であるノードの追加・表示・検索を実装しました。循環リンクリストの検索処理では、走査の終了条件として「現在のノードが再びheadに戻ったかどうか」を判定することが重要なポイントになります。これにより、リスト全体を一周した時点で確実にループを抜けられるようになっています。

  1. Pythonで循環リンクリストの要素をソートするプログラムの作り方

    循環リンクリストの要素を並べ替える必要がある場合は、まず「Node」クラスを作成します。このクラスには、ノードに格納するデータと、リンクリスト上の次のノードへの参照という2つの属性が定義されています。 循環リンクリストの特徴は、先頭(ヘッド)と末尾(テール)が互いに隣接している点です。両者は円を形成するように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」は存在しません。 続いて、初期化関数を持つ「linked_list」クラスを作成し、ノードの先頭を「None」に初期化します。 さらに、リンクリストへノードを追加するメソッド、リストを昇順・降順にソートするメソッド、ノ

  2. Pythonで学ぶ線形探索(リニアサーチ)の基本と実装方法

    この記事では、最も基本的な検索アルゴリズムの一つである「線形探索(Linear Search)」の仕組みを理解し、Python 3.xでの実装方法をわかりやすく解説します。 線形探索のアルゴリズム 配列 arr[] の左端の要素から順に、目的の要素 x と各要素を一つずつ比較していきます x がいずれかの要素と一致した場合、そのインデックス(位置)を返します x が配列内のどの要素とも一致しなかった場合、-1 を返すか「要素が見つからない」ことを示します それでは、このアプローチの流れを視覚的に確認してみましょう。 実装例 def linearsearch(arr, x):