Pythonでn個のノードを持つ双方向リンクリストを作成し、逆順に表示するプログラム
双方向リンクリスト(二重連結リスト)を作成し、その要素を逆順に表示したい場合、まず「Node」クラスを定義する必要があります。このクラスには3つの属性を持たせます。ノードに格納するデータ、リスト内の次のノードへの参照(next)、そして前のノードへの参照(previous)です。
次に、初期化用のコンストラクタを持つもう1つのクラスを作成します。このクラスの内部では、リストの先頭を表すheadを「None」に初期化します。
さらに、ユーザー側で複数のメソッドを定義します。具体的には、リンクリストへノードを追加するメソッド、ノードの並びを反転させるメソッド、そしてリンクリストのノードを表示するメソッドです。
以下に実装例を示します。
サンプルコード
class Node:
def __init__(self, my_data):
self.previous = None
self.data = my_data
self.next = None
class reverse_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.previous = None
self.tail.next = None
else:
self.tail.next = new_node
new_node.previous = self.tail
self.tail = new_node
self.tail.next = None
def reverse_vals(self):
curr = self.head
while(curr != None):
temp = curr.next
curr.next = curr.previous
curr.previous = temp
curr = curr.previous
temp = self.head
self.head = self.tail
self.tail = temp
def print_it(self):
curr = self.head
if (self.head == None):
print("リストは空です")
return
print("ノードの内容:")
while curr != None:
print(curr.data)
curr = curr.next
my_instance = reverse_list()
print("要素をリストに追加しています")
my_instance.add_data(10)
my_instance.add_data(14)
my_instance.add_data(24)
my_instance.add_data(17)
my_instance.add_data(22)
my_instance.print_it()
print("双方向リンクリストを反転した後のノード:")
my_instance.reverse_vals()
my_instance.print_it()出力
要素をリストに追加しています ノードの内容: 10 14 24 17 22 双方向リンクリストを反転した後のノード: ノードの内容: 22 17 24 14 10
解説
- まず「Node」クラスを作成します。各ノードはデータ、前のノードへの参照、次のノードへの参照という3つの属性を持ちます。
- 必要な属性を持つ別のクラス「reverse_list」を作成します。
- 「add_data」メソッドを定義し、双方向リンクリストの末尾にデータを追加できるようにします。リストが空の場合は新ノードがhead兼tailとなり、それ以外の場合は既存のtailの後ろに接続されます。
- 「reverse_vals」メソッドを定義し、双方向リンクリストのノードの順序を反転させます。このメソッドはリストを先頭から走査しながら、各ノードのnextとpreviousの参照を入れ替えていくことで反転を実現しています。最後にheadとtailを入れ替えれば完成です。
- 「print_it」メソッドを定義し、リンクリストのノードを先頭から順番に表示します。リストが空の場合はその旨を通知して処理を終了します。
- 「__init__」メソッドでは、headとtailをNoneに初期化します。
- 「reverse_list」クラスのインスタンスを作成し、add_dataメソッドで複数の要素を追加した後、print_itメソッドで元の順序を確認します。
- 続いて「reverse_vals」メソッドを呼び出し、リンクリスト全体を反転させます。
- 最後に再度「print_it」メソッドを使用して、反転された結果をコンソールに表示します。
-
Pythonで連結リストのi番目からj番目までのノードを反転させる方法
問題の概要連結リストと2つの値 i・j が与えられたとき、i 番目から j 番目までのノードを逆順に並べ替え、更新後のリストを返すことを考えます。例えば、入力が [1,2,3,4,5,6,7,8,9]、i = 2、j = 6 の場合、出力は次のようになります。[1, 2, 7, 6, 5, 4, 3, 8, 9]アルゴリズムの手順この問題は、以下の手順で解くことができます。値が None のダミーノード prev_head を作成し、先頭ノードを指させます。prev を prev_head に、curr を先頭ノードに設定します。i 回だけループし、prev と curr を1つずつ前へ進めま
-
Pythonで連結リストを逆順に反転するプログラム【再帰を使った実装方法】
はじめに 連結リスト(リンクリスト)が与えられたとき、それを逆順に並べ替えることを考えます。例えば、リストが 2 → 4 → 6 → 8 の場合、反転後の新しいリストは 8 → 6 → 4 → 2 となります。 本記事では、再帰処理を用いてこの問題を解く方法を、アルゴリズムの考え方から実際のコードまで詳しく解説します。 解決のためのアプローチ この問題は、各ノードの next ポインタの向きを先頭から順番に付け替えていくことで解決できます。具体的には、以下の手順に従います。 solve(head, back) という手続きを定義し、リストの反転を再帰的に行う head が存在しない(空の)