連結リスト(リンクリスト)の中央ノードを出力するPythonプログラム
連結リスト(リンクリスト)の中央に位置する要素を出力したい場合、「print_middle_val」という名前のメソッドを定義します。このメソッドは連結リストを引数として受け取り、その中央の要素を取得して表示します。
以下に実際の実装例を示します。
サンプルコード
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList_structure:
def __init__(self):
self.head = None
self.last_node = None
def add_vals(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 print_middle_val(my_list):
curr = my_list.head
my_len = 0
while curr:
curr = curr.next
my_len = my_len + 1
curr = my_list.head
for i in range((my_len - 1)//2):
curr = curr.next
if curr:
if my_len % 2 == 0:
print('The two middle elements are {} and {}'.format(curr.data, curr.next.data))
else:
print('The middle-most element is {}.'.format(curr.data))
else:
print('The list is empty')
my_instance = LinkedList_structure()
my_list = input('Enter the elements of the linked list... ').split()
for elem in my_list:
my_instance.add_vals(int(elem))
print_middle_val(my_instance)実行結果
Enter the elements of the linked list... 56 23 78 99 34 11 The two middle elements are 78 and 99
処理の流れと解説
まず「Node」クラスを作成します。このクラスはデータ本体(data)と次のノードへの参照(next)を保持します。
必要な属性を持つ「LinkedList_structure」クラスを作成します。
このクラスには「__init__」関数が含まれており、先頭要素である「head」を「None」で初期化します。同時に末尾ノードを管理する「last_node」も初期化しています。
「add_vals」というメソッドを定義します。このメソッドは連結リストの末尾に新しい値を追加する役割を担います。
もう一つのメソッド「print_middle_val」を定義し、連結リストの中央の値をコンソールに表示できるようにします。
「LinkedList_structure」クラスのインスタンスを作成します。
ユーザーから入力を受け取り、各要素を整数に変換しながら連結リストへ追加していきます。
最後に、この連結リストに対して「print_middle_val」メソッドを呼び出します。
結果がコンソールに出力されます。
ポイント解説
このプログラムでは、まずリスト全体を走査してノードの総数(my_len)をカウントしています。その後、総数が偶数の場合は中央の2つの要素を表示し、奇数の場合は中央の1つの要素のみを表示するように条件分岐しています。また、リストが空の場合には「The list is empty」というメッセージが出力されるため、エッジケースにも対応した堅牢な実装となっています。
-
Pythonで片方向リンクリストの中央ノードを1回の走査で見つける方法
片方向リンクリスト(単方向連結リスト)の先頭ノードが与えられたとき、その中央ノードの値を求めることを考えます。ノード数が偶数で中央にあたるノードが2つ存在する場合は、後ろ側(2番目)の中央ノードを返すものとします。さらに、リスト全体をたどるのは1回だけ(シングルパス)で解くのが条件です。例えば、入力が [5,9,6,4,8,2,1,4,5,2] の場合、要素数は10なので中央は「8」と「2」の2つになります。したがって、出力は後ろ側の 2 となります。解法のアプローチこの問題は、基準点となるポインタ p をゆっくり進めながら、カウンタを組み合わせて処理することで解けます。手順は以下の通りです。
-
Pythonで連結リストのノードを削除する方法
連結リスト(リンクリスト)にいくつかの要素が格納されているとします。ここでの課題は、指定されたノードをリストから削除する関数を作成することです。例えば、リストが 1 → 3 → 5 → 7 → 9 の場合、値 3 を削除すると、結果は 1 → 5 → 7 → 9 になります。削除の基本的な考え方削除したいノードを指すポインタ「node」が与えられている場合、以下の2つの操作を実行することでノードを削除できます。node.val = node.next.val — 次のノードの値を現在のノードにコピーするnode.next = node.next.next — 現在のノードの参照先を、次の次のノ