Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】双方向リンクリストの先頭からノードを削除する方法

双方向リンクリスト(二重連結リスト)の先頭からノードを削除するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータ(data)、リンクリスト内の次のノードへの参照(next)、前のノードへの参照(prev)という3つの属性を定義します。

以下に、具体的な実装例を示します。

サンプルコード

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

class double_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.prev = None
            self.tail.next = None
        else:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node
            self.tail.next = None

    def print_it(self):
        curr = self.head
        if (self.head == None):
            print("リストは空です")
            return
        print("双方向リンクリストのノード : ")
        while curr != None:
            print(curr.data)
            curr = curr.next

    def delete_from_beginning(self):
        if(self.head == None):
            return
        else:
            if(self.head != self.tail):
                self.head = self.head.next
                self.head.prev = None
            else:
                self.head = self.tail = 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(92)
my_instance.print_it()
while(my_instance.head != None):
    my_instance.delete_from_beginning()
    print("先頭の要素を削除した後のリスト : ")
    my_instance.print_it()

実行結果

要素を双方向リンクリストに追加しています
双方向リンクリストのノード : 
10
24
54
77
92
先頭の要素を削除した後のリスト : 
双方向リンクリストのノード : 
24
54
77
92
先頭の要素を削除した後のリスト : 
双方向リンクリストのノード : 
54
77
92
先頭の要素を削除した後のリスト : 
双方向リンクリストのノード : 
77
92
先頭の要素を削除した後のリスト : 
双方向リンクリストのノード : 
92
先頭の要素を削除した後のリスト : 
リストは空です

コードの解説

  • 「Node」クラスを作成し、コンストラクタ内で prev・data・next の3つの属性を初期化します。
  • リンクリスト本体を管理するための「double_list」クラスを別途作成します。
  • 「add_data」メソッドを定義し、リストが空の場合は新ノードを head かつ tail に設定し、空でない場合は末尾(tail)に接続します。
  • 「print_it」メソッドを定義し、head から順にノードをたどりながらすべてのデータを表示します。リストが空の場合はその旨を出力します。
  • 「delete_from_beginning」メソッドを定義し、先頭(head)ノードを削除して、次のノードを新しい head として設定します。
  • 「__init__」メソッドでは、head と tail を None に初期化します。
  • 「double_list」クラスのインスタンスを生成し、add_data メソッドで5つの要素(10, 24, 54, 77, 92)を追加します。
  • while ループにより、リストが空になるまで先頭ノードを繰り返し削除し、その都度「print_it」メソッドで現在の状態をコンソールに出力します。

削除処理のポイント

先頭ノードの削除は、head の参照を次のノードに付け替え、新しい head の prev を None にするだけで完了します。要素の移動が不要なため、計算量は O(1) と非常に効率的です。また、ノードが1つしかない場合(head == tail)は、head と tail の両方を None に設定することで、リスト全体を空の状態にできます。

  1. Pythonで連結リストのm個のノードを保持した後にn個のノードを削除するプログラム

    始点ノードが「head」である連結リストと、2つの整数 m と n が与えられたとします。リストを走査しながら、先頭から数えて m 個のノードを残した直後の n 個のノードを削除する処理を、連結リストの末尾に到達するまで繰り返します。処理は head ノードから開始し、最後に変更後の連結リストを返します。今回扱う連結リストの構造は次のように定義されています。Node value : <整数値> next : <次のノードへのポインタ>例えば、入力が elements = [1, 2, 3, 4, 5, 6, 7, 8]、m = 3、n = 1 の場合、出

  2. Pythonで連結リストのノードを削除する方法

    連結リスト(リンクリスト)にいくつかの要素が格納されているとします。ここでの課題は、指定されたノードをリストから削除する関数を作成することです。例えば、リストが 1 → 3 → 5 → 7 → 9 の場合、値 3 を削除すると、結果は 1 → 5 → 7 → 9 になります。削除の基本的な考え方削除したいノードを指すポインタ「node」が与えられている場合、以下の2つの操作を実行することでノードを削除できます。node.val = node.next.val — 次のノードの値を現在のノードにコピーするnode.next = node.next.next — 現在のノードの参照先を、次の次のノ