Pythonで循環リンクリストの中央からノードを削除する方法
循環リンクリスト(Circular Linked List)の中央からノードを削除するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータと、リンクリスト内の次のノードへの参照という2つの属性を持たせます。
循環リンクリストでは、先頭(head)と末尾(tail)が互いに隣接しています。つまり、最後のノードに「NULL」が存在せず、全体が円形につながった構造になっているのが特徴です。
次に、初期化関数を持つ別のクラスを作成します。このクラスでは、headを「None」で初期化し、サイズを表す変数sizeも0で初期化します。
さらに、ユーザー定義関数として、リンクリストへノードを追加する機能、コンソールに内容を出力する機能、そして中央のインデックスからノードを削除する機能を実装します。
以下に実際のコード例を示します。
サンプルコード
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
self.size = 0
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
self.size = int(self.size)+1
def delete_from_mid(self):
if(self.head == None):
return
else:
count = (self.size//2) if (self.size % 2 == 0) else ((self.size+1)//2)
if( self.head != self.tail ):
temp = self.head
curr = None
for i in range(0, count-1):
curr = temp
temp = temp.next
if(curr != None):
curr.next = temp.next
temp = None
else:
self.head = self.tail = temp.next
self.tail.next = self.head
temp = None
else:
self.head = self.tail = None
self.size = self.size - 1
def print_it(self):
curr = self.head
if self.head is None:
print("The list is empty")
return
else:
print(curr.data),
while(curr.next != self.head):
curr = curr.next
print(curr.data),
print("\n")
class circular_linked_list:
my_cl = list_creation()
my_cl.add_data(11)
my_cl.add_data(52)
my_cl.add_data(36)
my_cl.add_data(74)
print("The original list is :")
my_cl.print_it()
while(my_cl.head != None):
my_cl.delete_from_mid()
print("The list after updation is :")
my_cl.print_it()実行結果
The original list is : 11 52 36 74 The list after updation is : 11 36 74 The list after updation is : 11 74 The list after updation is : 74 The list after updation is : The list is empty
コードの解説
- まず「Node」クラスを作成し、データと次ノードへの参照を保持できるようにします。
- 必要な属性を持つ「list_creation」クラスを作成します。
- 「add_data」メソッドを定義し、循環リンクリストへデータを追加できるようにします。
- 「delete_from_mid」メソッドを定義し、参照を切り替えることで中央の要素を順番に削除します。
- 「print_it」メソッドを定義し、リンクリストの内容をコンソールに表示します。
- 「list_creation」クラスのオブジェクトを生成し、メソッドを呼び出してデータを追加します。
- 「delete_from_mid」メソッドを呼び出して削除処理を実行します。
- リンクリスト内のノードを走査して中央のインデックスを特定し、そこから要素を削除していきます。
- 削除後の状態は「print_it」メソッドを使ってコンソールに出力されます。
-
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 — 現在のノードの参照先を、次の次のノ