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

【Python】双方向リンクリストの中央に新しいノードを挿入するプログラム

双方向リンクリスト(Doubly Linked List)の中央に新しいノードを挿入したい場合、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納するデータ、次のノードへの参照(next)、前のノードへの参照(previous)という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("The list is empty")
            return
        print("The nodes in the doubly linked list are :")
        while curr != None:
            print(curr.data)
            curr = curr.next

    def add_data_in_middle(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:
            curr = self.head
            mid = (self.size//2) if(self.size % 2 == 0) else ((self.size+1)//2)
            for i in range(1, mid):
                curr = curr.next
            temp = curr.next
            temp.previous = curr
            curr.next = new_node
            new_node.previous = curr
            new_node.next = temp
            temp.previous = new_node
        self.size = self.size + 1

my_instance = double_list()
print("Elements are being added to the doubly linked list")
my_instance.add_data(10)
my_instance.add_data(24)
my_instance.add_data(54)
print("Elements are added to the middle of the list")
my_instance.add_data_in_middle(77)
my_instance.print_it()
my_instance.add_data_in_middle(92)
my_instance.print_it()

出力結果

Elements are being added to the doubly linked list
Elements are added to the middle of the list
The nodes in the doubly linked list are :
10
24
77
54
The nodes in the doubly linked list are :
10
24
92
77
54

解説

  • ノードの構造を定義する「Node」クラスを作成します。
  • リンクリスト本体を管理するための属性を持つ「double_list」クラスを作成します。
  • 双方向リンクリストの中央インデックスにデータを追加するメソッド「add_data_in_middle」を定義します。
  • リストの末尾にノードを追加するメソッド「add_data」を定義します。
  • リンクリスト内のすべてのノードを表示するメソッド「print_it」を定義します。
  • 「double_list」クラスのインスタンスを生成し、各メソッドを呼び出してデータを追加していきます。
  • 「add_data_in_middle」を呼び出すことで、リンクリストの中央にデータを挿入できます。
  • 初期化用の「__init__」メソッドでは、head(先頭)とtail(末尾)をNoneに設定し、要素数を管理するsizeを0で初期化します。
  • 最後に「print_it」メソッドを使って、結果をコンソールに表示します。

中央位置の計算ロジック

挿入位置となる中央インデックスは、要素数が偶数の場合は size // 2、奇数の場合は (size + 1) // 2 で求められます。これにより、リストの要素数に関わらず、常に中央付近に新しいノードが挿入される仕組みになっています。

ノード挿入時のポイント

中央にノードを挿入する際は、参照(ポインタ)の付け替え順序が非常に重要です。既存ノード同士の接続を変更する前に、挿入位置の後続ノードへの参照を一時変数 temp に保存しておくことで、リンク切れを防ぐことができます。その後、新ノードと前後ノードの previous・next を適切に再設定することで、リストの中央へ安全にノードを組み込めます。

  1. Pythonで循環リンクリストの要素をソートするプログラムの作り方

    循環リンクリストの要素を並べ替える必要がある場合は、まず「Node」クラスを作成します。このクラスには、ノードに格納するデータと、リンクリスト上の次のノードへの参照という2つの属性が定義されています。 循環リンクリストの特徴は、先頭(ヘッド)と末尾(テール)が互いに隣接している点です。両者は円を形成するように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」は存在しません。 続いて、初期化関数を持つ「linked_list」クラスを作成し、ノードの先頭を「None」に初期化します。 さらに、リンクリストへノードを追加するメソッド、リストを昇順・降順にソートするメソッド、ノ

  2. Pythonで片方向リンクリストの中央ノードを1回の走査で見つける方法

    片方向リンクリスト(単方向連結リスト)の先頭ノードが与えられたとき、その中央ノードの値を求めることを考えます。ノード数が偶数で中央にあたるノードが2つ存在する場合は、後ろ側(2番目)の中央ノードを返すものとします。さらに、リスト全体をたどるのは1回だけ(シングルパス)で解くのが条件です。例えば、入力が [5,9,6,4,8,2,1,4,5,2] の場合、要素数は10なので中央は「8」と「2」の2つになります。したがって、出力は後ろ側の 2 となります。解法のアプローチこの問題は、基準点となるポインタ p をゆっくり進めながら、カウンタを組み合わせて処理することで解けます。手順は以下の通りです。