リンクリスト内のサイクルを検出するPythonプログラム
リンクリスト内のサイクルを検出する必要がある場合は、リンクリストに要素を追加する方法と、リンクリスト内の要素を取得する方法を定義します。ヘッドとリアの値が同じかどうかをチェックする別の方法が定義されています。この結果に基づいて、サイクルが検出されます。
以下は同じのデモンストレーションです-
例
class Node: def __init__(self, data): self.data = data self.next = None class LinkedList_structure: def __init__(self): self.head = None self.last_node = None def add_vals(self, data): if self.last_node is None: self.head = Node(data) self.last_node = self.head else: self.last_node.next = Node(data) self.last_node = self.last_node.next def get_node_val(self, index): curr = self.head for i in range(index): curr = curr.next if curr is None: return None return curr def check_cycle(my_list): slow_val = my_list.head fast_val = my_list.head while (fast_val != None and fast_val.next != None): slow_val = slow_val.next fast_val = fast_val.next.next if slow_val == fast_val: return True return False my_linked_list = LinkedList_structure() my_list = input('Enter the elements in the linked list ').split() for elem in my_list: my_linked_list.add_vals(int(elem)) my_len = len(my_list) if my_len != 0: vals = '0-' + str(my_len - 1) last_ptr = input('Enter the index [' + vals + '] of the node' ' at which the last node has to point'' (Enter nothing to point to None): ').strip() if last_ptr == '': last_ptr = None else: last_ptr = my_linked_list.get_node_val(int(last_ptr)) my_linked_list.last_node.next = last_ptr if check_cycle(my_linked_list): print("The linked list has a cycle") else: print("The linked list doesn't have a cycle")
出力
Enter the elements in the linked list 56 78 90 12 4 Enter the index [0-4] of the node at which the last node has to point (Enter nothing to point to None): The linked list doesn't have a cycle
説明
-
「Node」クラスが作成されます。
-
必要な属性を持つ別の「LinkedList_structure」クラスが作成されます。
-
最初の要素、つまり「head」を「None」に初期化するために使用される「init」関数があります。
-
スタックに値を追加するのに役立つ「add_vals」という名前のメソッドが定義されています。
-
「get_node_val」という名前の別のメソッドが定義されています。これは、リンクリスト内の現在のノードの値を取得するのに役立ちます。
-
「check_cycle」という名前の別のメソッドが定義されています。これは、ヘッドとリアが同じであるかどうかを確認するのに役立ちます。つまり、これはサイクルになります。
-
サイクルの有無に応じてTrueまたはFalseを返します。
-
「LinkedList_structure」のインスタンスが作成されます。
-
リンクリストに要素が追加されます。
-
このリンクリストで「check_cycle」メソッドが呼び出されます。
-
出力はコンソールに表示されます。
-
Pythonのリンクリストサイクル
リンクリストがあり、サイクルがあるかどうかを確認する必要があるとします。指定されたリンクリストでサイクルを表すために、posと呼ばれる1つの整数ポインターを使用します。この位置は、テールが接続されているリンクリスト内の位置を表します。したがって、posが-1の場合、リンクリストにサイクルは存在しません。たとえば、リンクリストは[5、3、2、0、-4、7]のようで、pos =1です。したがって、サイクルがあり、テールは2番目のノードに接続されます。 これを解決するには、次の手順に従います- 1つのセットをハッシュセットHとして取得します ヘッドがnullでない場合- ヘッドがHにある場合は、
-
有向グラフでサイクルを検出するためのPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −有向グラフが与えられたので、グラフにサイクルが含まれているかどうかを確認する必要があります。指定されたグラフに少なくとも1つのサイクルが含まれている場合、出力はtrueである必要があり、そうでない場合はfalseです。 次に、以下の実装のソリューションを見てみましょう- 例 # collections module from collections import defaultdict # class for creation of graphs class Graph(): #