【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(self, my_data):
new_node = Node(my_data)
if(self.head == None):
self.head = self.tail = new_node
self.head.prev = None
self.tail.next = None
else:
self.tail.next = new_node
new_node.prev = self.tail
self.tail = new_node
self.tail.next = None
def min_node(self):
curr = self.head
if(self.head == None):
print("The list is empty")
return 0
else:
minimum = self.head.data
while(curr != None):
if(minimum > curr.data):
minimum = curr.data
curr = curr.next
return minimum
def max_node(self):
curr = self.head
if(self.head == None):
print("The list is empty")
return 0
else:
maximum = self.head.data
while(curr != None):
if(curr.data > maximum):
maximum = curr.data
curr = curr.next
return maximum
def print_it(self):
curr = self.head
if (self.head == None):
print("The list is empty")
return
print("The nodes in the doubly linked list are :")
while curr != None:
print(curr.data)
curr = curr.next
my_instance = double_list()
print("Elements are being added to the doubly linked list")
my_instance.add_data(10)
my_instance.add_data(24)
my_instance.add_data(54)
my_instance.add_data(77)
my_instance.add_data(92)
my_instance.print_it()
print("The node with maximum value is : ")
print(my_instance.max_node())
print("The node with minimum value is : ")
print(my_instance.min_node())実行結果
Elements are being added to the doubly linked list The nodes in the doubly linked list are : 10 24 54 77 92 The node with maximum value is : 92 The node with minimum value is : 10
処理の流れと解説
- まず「Node」クラスを作成します。
- 続いて、必要な属性を持つ「double_list」クラスを作成します。
- 「add_data」メソッドを定義し、双方向連結リストの末尾にデータを追加できるようにします。
- 「print_it」メソッドを定義し、連結リスト内のすべてのノードを順番に表示します。
- 「max_node」メソッドを定義し、双方向連結リスト内の最大値を検索します。
- 「min_node」メソッドを定義し、双方向連結リスト内の最小値を検索します。
- 「__init__」メソッドでは、headノードとtailノードをNoneに初期化します。
- 「double_list」クラスのインスタンスを生成し、各メソッドを呼び出してノードの最大値と最小値を求めます。
- リストを先頭から順に走査しながら各ノードの値を比較することで、最大値と最小値を特定できます。
- 最後に、結果をコンソールに出力して確認します。
計算量について
max_nodeメソッドおよびmin_nodeメソッドは、リスト全体を一度だけ走査するため、時間計算量はO(n)です(nは連結リスト内のノード数)。また、リストが空の場合には「The list is empty」というメッセージを表示し、0を返すようになっています。双方向連結リストは前後両方向へのポインタを持つため、挿入や削除が柔軟に行える一方、ランダムアクセスには向かないという特徴があります。
-
Pythonで木の辺を1本取り除いたときの部分木のノード値合計の差の最小値を求めるプログラム
問題の概要ノードに1からnまでの番号が振られた木があるとします。各ノードには整数値が格納されています。ここで、木からある1本の辺を取り除くと、木は2つの部分木に分割されます。このとき、2つの部分木のノード値の合計の差が最小になるようにしたいと考えます。私たちのタスクは、その最小の差を求めて返すことです。木は辺のリストとして与えられ、各ノードの値も併せて提供されます。例として、n = 6、edge_list = [[1, 2], [1, 3], [2, 4], [3, 5], [3, 6]]、values = [15, 25, 15, 55, 15, 65] が入力された場合、出力は 0 になり
-
Pythonでリスト内の最大値・最小値の位置を見つける方法
Pythonでは、リスト内の最大値や最小値を求めるのが非常に簡単で、それらの位置(インデックス)も簡単に取得できます。Pythonには便利な組み込み関数が用意されており、min()はリスト内の最小値を求め、max()はリスト内の最大値を求めます。さらに、index()を使えば特定の要素のインデックス(位置)を調べることができます。 アルゴリズム maxminposition(A, n) /* Aはユーザーが入力したリスト、nはリストのサイズ */ ステップ1:組み込み関数を使って最小要素の位置を求める A.index(min(A)) ステップ2:組み込み関数を使って最