【Python】双方向リンクリストの先頭に新しいノードを挿入するプログラム
双方向リンクリスト(Doubly Linked List)の先頭に新しいノードを挿入するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータ、リンクリスト上の次のノードへの参照、前のノードへの参照という3つの属性を定義します。
以下に具体的な実装例を示します。
サンプルコード
class Node:
def __init__(self, my_data):
self.prev = None # 前のノードへの参照
self.data = my_data # ノードが保持するデータ
self.next = None # 次のノードへの参照
class double_list:
def __init__(self):
self.head = None # 先頭ノード
self.tail = None # 末尾ノード
# 先頭にデータを追加するメソッド
def add_data_at_start(self, my_data):
new_node = Node(my_data)
if self.head is None:
# リストが空の場合
self.head = self.tail = new_node
else:
# 既存の先頭ノードの前に新しいノードをつなぐ
new_node.next = self.head
self.head.prev = new_node
self.head = new_node
# リストの内容を表示するメソッド
def print_it(self):
curr = self.head
if self.head is None:
print("The list is empty")
return
print("The nodes in the doubly linked list are :")
while curr is not None:
print(curr.data)
curr = curr.next
my_instance = double_list()
print("Elements are being added to the beginning of doubly linked list")
my_instance.add_data_at_start(10)
my_instance.print_it()
my_instance.add_data_at_start(24)
my_instance.print_it()
my_instance.add_data_at_start(54)
my_instance.print_it()
my_instance.add_data_at_start(77)
my_instance.print_it()
my_instance.add_data_at_start(92)
my_instance.print_it()
実行結果
Elements are being added to the beginning of doubly linked list The nodes in the doubly linked list are : 10 The nodes in the doubly linked list are : 24 10 The nodes in the doubly linked list are : 54 24 10 The nodes in the doubly linked list are : 77 54 24 10 The nodes in the doubly linked list are : 92 77 54 24 10
コードの解説
- まず「Node」クラスを作成します。各ノードは、保持するデータ(data)、前のノードへの参照(prev)、次のノードへの参照(next)の3つの属性を持ちます。
- 続いて、リンクリスト本体を管理するための「double_list」クラスを作成します。
- 「add_data_at_start」メソッドを定義し、双方向リンクリストの先頭にデータを追加できるようにします。
- 「print_it」メソッドを定義し、リンクリスト内のノードを先頭から順番に表示します。
- 「__init__」メソッドでは、head(先頭)とtail(末尾)のポインタをNoneで初期化します。
- 「double_list」クラスのインスタンスを生成し、メソッドを呼び出してリストの先頭へデータを追加していきます。
- 要素を追加するたびに、新しいノードがリストの先頭に挿入され、既存のノードは後ろにずれていきます。
- 挿入後のリストの状態は、「print_it」メソッドを使ってコンソールに表示されます。
計算量について
双方向リンクリストの先頭への挿入は、headポインタを付け替えるだけで完了するため、要素数に関係なくO(1)の計算量で実行できます。これは配列の先頭への挿入(全要素をずらす必要がありO(n))と比較して大きな利点です。
-
Pythonでn個のノードを持つ双方向リンクリストを作成し、ノード数をカウントする方法
双方向リンクリスト(ダブルリンクリスト)のノード数をカウントするには、まず「Node」クラスを作成する必要があります。このクラスには3つの属性を定義します。ノードが保持するデータ(data)、次のノードへの参照(next)、そして前のノードへの参照(prev)です。双方向リンクリストでは、各ノードがポインタを持ちます。現在のノードは、次のノードと前のノードの両方へのポインタを保持しています。リストの末尾にあるノードは、nextポインタに「NULL」(PythonではNone)を格納します。この構造により、リストは前方・後方のどちらの方向にも走査できるのが特徴です。以下に、具体的なコード例を示し
-
Pythonで循環リンクリストの要素をソートするプログラムの作り方
循環リンクリストの要素を並べ替える必要がある場合は、まず「Node」クラスを作成します。このクラスには、ノードに格納するデータと、リンクリスト上の次のノードへの参照という2つの属性が定義されています。 循環リンクリストの特徴は、先頭(ヘッド)と末尾(テール)が互いに隣接している点です。両者は円を形成するように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」は存在しません。 続いて、初期化関数を持つ「linked_list」クラスを作成し、ノードの先頭を「None」に初期化します。 さらに、リンクリストへノードを追加するメソッド、リストを昇順・降順にソートするメソッド、ノ