Pythonで連結リスト(リンクリスト)を作成し、要素を表示するプログラムの書き方
連結リスト(リンクリスト)を作成し、その中の要素を表示したい場合、「リストに値を追加するメソッド」と「要素を表示するメソッド」の2つを実装する必要があります。
本記事では、Pythonを使って連結リストを構築し、ユーザーが入力したデータを格納・表示するまでの一連の流れを、サンプルコードとともにわかりやすく解説します。
サンプルコード
class Node:
def __init__(self, data):
self.data = data
self.next = None
class my_linked_list:
def __init__(self):
self.head = None
self.last_node = None
def add_value(self, my_data):
if self.last_node is None:
self.head = Node(my_data)
self.last_node = self.head
else:
self.last_node.next = Node(my_data)
self.last_node = self.last_node.next
def print_it(self):
curr = self.head
while curr is not None:
print(curr.data)
curr = curr.next
my_instance = my_linked_list()
n = int(input('How many elements should be added ? '))
for i in range(n):
data = int(input('Enter a data value : '))
my_instance.add_value(data)
print('The linked list is : ')
my_instance.print_it()実行結果
How many elements should be added ? 4 Enter a data value : 6 Enter a data value : 7 Enter a data value : 8 Enter a data value : 9 The linked list is : 6 7 8 9
コードの解説
まず、個々のノードを表す「Node」クラスを作成します。このクラスは、データ本体を保持する
dataと、次のノードへの参照を保持するnextの2つの属性を持ちます。続いて、連結リスト本体となる「my_linked_list」クラスを、必要な属性とともに定義します。
このクラスには初期化用の
__init__関数があり、先頭ノードを指す「head」と最後のノードを指す「last_node」を、いずれもNoneに初期化します。これにより、空のリスト状態からスタートできます。「add_value」という名前のメソッドを定義し、連結リストの末尾へ新しいデータを追加できるようにしています。リストが空の場合は新規ノードが head となり、既存のノードがある場合は last_node の next に新しいノードを接続します。
さらに「print_it」というメソッドを定義し、head から順にノードをたどりながら、連結リストの全データをコンソールに表示します。
「my_linked_list」クラスのインスタンス(オブジェクト)を生成します。
ユーザーから、連結リストに追加する要素の個数を入力として受け取ります。
入力された回数だけループを反復処理し、そのたびに
add_valueメソッドを呼び出してデータをリストに追加していきます。最後に
print_itメソッドを使用して、登録されたすべての要素をコンソールに出力します。
ポイントまとめ
このプログラムでは、Nodeクラスで1つひとつのデータ単位を管理し、my_linked_listクラスでリスト全体の構造(先頭・末尾の追跡)を制御しています。last_node を保持しておくことで、末尾への追加が O(1) で行えるのが特徴です。連結リストは配列と異なりサイズの固定がないため、動的にデータを追加・削除したい場面で非常に有用なデータ構造です。
-
Pythonで三分木(三項木)から双方向連結リストを作成する方法
三分木(各ノードが最大3つの子ノードを持つ木構造)を双方向連結リストに変換するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納されるデータと、left(左)・mid(中央)・right(右)の子ノードへの参照という属性を持たせます。続いて、初期化処理を行う「ternary_tree_to_list」クラスを作成します。このクラスでは、ルート(root)、先頭(head)、末尾(tail)の各ポインタを「None」で初期化します。双方向連結リストとは双方向連結リストでは、各ノードが前後両方のノードへのポインタを持ちます。現在のノードは、次のノードへのポインタと前
-
Pythonで循環リンクリストの要素をソートするプログラムの作り方
循環リンクリストの要素を並べ替える必要がある場合は、まず「Node」クラスを作成します。このクラスには、ノードに格納するデータと、リンクリスト上の次のノードへの参照という2つの属性が定義されています。 循環リンクリストの特徴は、先頭(ヘッド)と末尾(テール)が互いに隣接している点です。両者は円を形成するように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」は存在しません。 続いて、初期化関数を持つ「linked_list」クラスを作成し、ノードの先頭を「None」に初期化します。 さらに、リンクリストへノードを追加するメソッド、リストを昇順・降順にソートするメソッド、ノ