Pythonで双方向連結リストを指定したNノード分回転させる方法
双方向連結リスト(doubly linked list)を特定のノード数だけ回転させたい場合、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータ、次のノードへの参照、前のノードへの参照という3つの属性を持たせます。
以下に具体的な実装例を示します。
サンプルコード
class Node:
def __init__(self, my_data):
self.previous = None
self.data = my_data
self.next = None
class double_list:
def __init__(self):
self.head = None
self.tail = None
self.size = 0
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
self.size = self.size + 1
def print_it(self):
curr = self.head
if(self.head == None):
print("リストは空です")
return
print("双方向連結リストのノード:")
while curr != None:
print(curr.data)
curr = curr.next
def rotate_list(self, num):
curr = self.head
if(num == 0 or num >= self.size):
return
else:
for i in range(1, num):
curr = curr.next
self.tail.next = self.head
self.head = curr.next
self.head.previous = None
self.tail = curr
self.tail.next = None
my_instance = double_list()
print("要素を双方向連結リストに追加します")
my_instance.add_data(10)
my_instance.add_data(24)
my_instance.add_data(54)
my_instance.add_data(77)
my_instance.add_data(24)
my_instance.add_data(0)
my_instance.print_it()
print("回転後のリストの要素:")
my_instance.rotate_list(4)
my_instance.print_it()
実行結果
要素を双方向連結リストに追加します 双方向連結リストのノード: 10 24 54 77 24 0 回転後のリストの要素: 双方向連結リストのノード: 24 0 10 24 54 77
解説
- まず、データ・前ノードへの参照・次ノードへの参照を持つ「Node」クラスを作成します。
- 続いて、head(先頭)・tail(末尾)・size(要素数)といった必要な属性を持つ「double_list」クラスを作成します。
- 「add_data」メソッドは、リストの末尾に新しいノードを追加するためのメソッドです。
- 「rotate_list」メソッドは、指定した位置のノードを基準(ピボット)としてリストを回転させ、各要素の位置を移動させます。
- 「print_it」メソッドは、連結リストの内容をコンソールに表示するためのメソッドです。
- 「double_list」クラスのインスタンスを生成し、「add_data」メソッドを呼び出して6つの要素を追加します。
- 「rotate_list(4)」を呼び出すと、先頭から数えて4番目のノードが新しい末尾となり、その次のノードが新しい先頭になります。これにより、リスト全体が左方向に回転します。
- 回転後のリストの状態は、「print_it」メソッドを使ってコンソールに出力して確認できます。
なお、rotate_list メソッドでは、回転数が0の場合やリストの要素数以上の場合は処理を行わずそのまま返るようになっている点にも注目してください。これにより、無効な入力に対しても安全に動作します。
-
循環リンクリスト内の要素を検索するPythonプログラム
循環リンクリストとは循環リンクリスト(Circular Linked List)は、通常のリンクリストと異なり、最後のノードが先頭ノードに接続されているデータ構造です。そのため、リスト内に「NULL」で終わるノードが存在せず、head(先頭)とtail(末尾)が互いに隣接し、円を形成するように連結されています。循環リンクリスト内の特定の要素を検索するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納されるデータと、次のノードへの参照という2つの属性を持たせます。さらに、初期化関数を持つ別のクラスを作成し、headノードを「None」で初期化します。そして、リスト
-
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つずつ前へ進めま