基本情報科目Bサンプル問題:問10 単方向リストの要素削除をマスターする:Pythonによる実装


単方向リストから要素を削除する手続きについて

単方向リスト(リンクリスト)は、コンピュータ科学の基本的なデータ構造の一つであり、「節(ノード)」という要素が次の節へのリンクを持つことで一連のデータを構成します。各ノードは通常、格納された「データ」と「次のノードへの参照(リンク)」を保持しています。

リストから要素を削除する7つのステップ

ステップ1:空のリストのチェック

リストが空でないことを確認します。もしリストが空なら、削除する対象が存在しないため処理を終了します。

ステップ2:削除する要素の特定

削除したい要素を「値」や「位置」によって特定します。

ステップ3:ノードの検索

リストの先頭(ヘッド)から順に巡回し、削除対象のノードを検索します。この際、削除するノードの「直前のノード」も特定しておく必要があります(リンクを繋ぎ変えるために不可欠です)。

ステップ4:ノードの削除(リンクの更新)

削除対象のノードが見つかったら、その直前のノードの参照先を、削除するノードの次のノードへと更新します。これにより、リストの連結から対象ノードが切り離されます。

ステップ5:メモリの解放

切り離されたノードを破棄してメモリを解放します。PythonやJavaのようなガベージコレクションがある言語では、参照がなくなった時点で自動的に処理されるため、明示的な記述は不要なことが多いです。

ステップ6:ヘッドノードの削除

削除対象がリストの先頭(ヘッド)である場合は、特別な処理が必要です。現在のヘッドの「次のノード」を、新たなヘッドとして設定します。

ステップ7:削除確認

最後に、正しく削除されたかを確認します。リストを再巡回し、対象の要素が存在しないことをチェックします。


Pythonによる実装例

1. ノードの定義

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

2. リストの定義と削除メソッド

class LinkedList:
    def __init__(self):
        self.head = None

    def delete_node(self, key):
        temp = self.head

        # 1. 削除するノードがヘッドノードの場合
        if (temp is not None):
            if (temp.data == key):
                self.head = temp.next
                temp = None
                return

        # 2. 削除するノードを探索(直前のノードを prev に保持)
        prev = None
        while(temp is not None):
            if temp.data == key:
                break
            prev = temp
            temp = temp.next

        # 3. ノードがリストに存在しなかった場合
        if(temp == None):
            return

        # 4. リンクを繋ぎ変えてノードを除外
        prev.next = temp.next
        temp = None

3. 実行例

llist = LinkedList()
llist.head = Node(1)
second = Node(2)
third = Node(3)
llist.head.next = second
second.next = third

print("Original Linked List:")
temp = llist.head
while(temp):
    print(temp.data, end=' ')
    temp = temp.next
print()

# 要素「2」を削除
llist.delete_node(2)

print("Linked List after deletion of 2:")
temp = llist.head
while(temp):
    print(temp.data, end=' ')
    temp = temp.next

まとめ

単方向リストの削除アルゴリズムを理解することは、メモリ上のデータの繋がりを意識する訓練になります。これは基本情報技術者試験の対策のみならず、効率的なプログラムを書くためのデータ構造の基礎体力を養うことに直結します。

問題演習で知識を定着させましょう。

サンプル問題問10