Pythonで単方向リンクリストを循環リンクリストに変換する方法
単方向リンクリスト(片方向連結リスト)を循環リンクリストへ変換する必要がある場合、convert_to_circular_list というメソッドを定義します。このメソッドは、リストの最後のノードが先頭のノードを指すようにすることで、リスト全体を循環構造にします。
以下に具体的な実装例を示します。
サンプルコード
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList_struct:
def __init__(self):
self.head = None
self.last_node = None
def add_elements(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 convert_to_circular_list(my_list):
if my_list.last_node:
my_list.last_node.next = my_list.head
def last_node_points(my_list):
last = my_list.last_node
if last is None:
print('The list is empty...')
return
if last.next is None:
print('The last node points to None...')
else:
print('The last node points to element that has {}...'.format(last.next.data))
my_instance = LinkedList_struct()
my_input = input('Enter the elements of the linked list.. ').split()
for data in my_input:
my_instance.add_elements(int(data))
last_node_points(my_instance)
print('The linked list is being converted to a circular linked list...')
convert_to_circular_list(my_instance)
last_node_points(my_instance)実行結果
Enter the elements of the linked list.. 56 32 11 45 90 87 The last node points to None... The linked list is being converted to a circular linked list... The last node points to element that has 56...
コードの解説
まず、ノードのデータと次ノードへの参照を持つ Node クラスを作成します。
次に、必要な属性を備えた LinkedList_struct クラスを定義します。
このクラスには __init__(イニシャライザ)があり、先頭ノード(head)と最終ノード(last_node)を初期値 None として初期化します。
add_elements メソッドは、リンクリストの末尾に新しい要素を追加するために使用されます。リストが空の場合は新規ノードが head となり、そうでなければ既存の最終ノードの next に新しいノードを接続します。
convert_to_circular_list メソッドは、最終ノードの next 参照を先頭ノード(head)に向けることで、リストを循環構造に変換します。
last_node_points メソッドは、リストが空であるか、最終ノードが None を指しているか、あるいは特定のノードを指しているかを確認し、その状態を出力します。
LinkedList_struct クラスのインスタンス(オブジェクト)を生成します。
ユーザーからリンクリストに格納する要素を入力として受け取ります。
入力された各要素を順番にリンクリストへ追加していきます。
変換前に last_node_points メソッドを呼び出し、現状の最終ノードの参照先を確認します。
convert_to_circular_list を実行してリストを循環化した後、再度参照先を確認すると、最終ノードが先頭の要素(56)を指していることがコンソールに出力され、循環リンクリストへの変換が成功したことがわかります。
-
JavaScriptで学ぶ循環型単一リンクリスト(Circular Singly Linked List)の基本
循環型単一リンクリストとは? 循環型単一リンクリスト(Circular Singly Linked List)とは、通常の単一リンクリスト(片方向連結リスト)を変形させたデータ構造です。最大の特徴は、最後のノードのnextポインタが最初のノードを指すという点にあります。 一般的な単一リンクリストでは、末尾ノードのnextポインタはnullを指し、そこでリストが終了します。しかし循環型の場合、このnextポインタが先頭ノードへと接続されるため、リスト全体がひとつの輪(リング)のように連なり、終端のない環状構造になります。 通常の単一リンクリストとの違い 終端の扱い: 通常のリストでは末尾ノ
-
【Python】連結リストをジグザグ二分木に変換するプログラムの書き方
問題の概要単方向連結リスト(片方向リンクリスト)が与えられたとき、次のルールに従って二分木へ変換することを考えます。連結リストの先頭ノード(head)が、二分木のルートになります。それ以降の各ノードは、その値が親ノードより小さい場合は左の子に、そうでない場合は右の子になります。たとえば、入力が [2,1,3,4,0,5] の場合、変換後の二分木は次のような「ジグザグ」形状になります。解き方の手順この問題は、再帰的に呼び出す関数 solve() を定義すると、シンプルに解くことができます。具体的な手順は以下の通りです。ノードを引数として受け取る関数 solve() を定義します。ノードが nul