Pythonで循環リンクリストから最大値ノードと最小値ノードを検索する方法
循環リンクリスト(環状連結リスト)から最大値ノードと最小値ノードを検索する必要がある場合、まず「Node」クラスを作成します。このクラスには、ノードに格納されるデータと、リンクリストにおける次のノードへの参照という2つの属性が含まれます。
循環リンクリストでは、先頭(head)と末尾(tail)が互いに隣接しています。これらは円形になるように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」が存在しません。
さらに、初期化関数を持つ別のクラスを作成し、ノードのheadを「None」で初期化します。
続いて、リンクリストへノードを追加するメソッド、ノード内の最小値・最大値を検索するメソッド、そして結果を表示するメソッドなど、複数のメソッドを定義していきます。
以下に具体的な実装例を示します。
サンプルコード
class Node:
def __init__(self,data):
self.data = data
self.next = None
class list_creation:
def __init__(self):
self.head = Node(None)
self.tail = Node(None)
self.head.next = self.tail
self.tail.next = self.head
def add_data(self,my_data):
new_node = Node(my_data)
if self.head.data is None:
self.head = new_node
self.tail = new_node
new_node.next = self.head
else:
self.tail.next = new_node
self.tail = new_node
self.tail.next = self.head
def find_min_node(self):
curr = self.head
min_val = self.head.data
if(self.head == None):
print("The list is empty")
else:
while(True):
if(min_val > curr.data):
min_val = curr.data
curr = curr.next
if(curr == self.head):
break
print("Minimum value node in the list: "+ str(min_val))
def find_max_node(self):
curr = self.head
max_val = self.head.data
if(self.head == None):
print("List is empty")
else:
while(True):
if(max_val < curr.data):
max_val = curr.data
curr = curr.next
if(curr == self.head):
break
print("The maximum valueed node is : "+ str(max_val))
class circular_linked_list:
my_cl = list_creation()
print("Values have been added to the list")
my_cl.add_data(11)
my_cl.add_data(52)
my_cl.add_data(36)
my_cl.add_data(74)
my_cl.find_max_node()
my_cl.find_min_node()出力
Values have been added to the list The maximum valueed node is : 74 Minimum value node in the list: 11
コードの解説
- まず、ノードの構造を表す「Node」クラスを作成します。
- 次に、必要な属性を持つ「list_creation」クラスを作成します。
- 「__init__」メソッドでは、循環リンクリストの最初と最後のノードをNoneで初期化し、headとtailが互いを指すように設定します。
- 「add_data」メソッドは、循環リンクリストに新しいデータを追加するために使用されます。リストが空の場合は新ノードがhead兼tailとなり、自身を指すことで循環構造を形成します。
- 「find_max_node」メソッドは、リスト全体を走査し、各ノードの値を比較しながら最大値を取得します。
- 「find_min_node」メソッドも同様にリストを走査し、最小値を取得します。
- 走査は「curr」が再びheadに戻った時点で終了します。これが循環リンクリスト特有の終了条件です。
- 「list_creation」クラスのオブジェクトを生成し、メソッドを呼び出してデータ(11、52、36、74)を追加します。
- 最後に「find_max_node」と「find_min_node」を呼び出し、リスト内の最大値と最小値をコンソールに表示します。
このアルゴリズムの計算量はO(n)です。リスト内の全ノードを一度ずつ訪問するため、ノード数に比例した時間がかかります。空間計算量はO(1)であり、比較用の変数のみを使用するため効率的です。
-
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:組み込み関数を使って最