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

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の場合やリストの要素数以上の場合は処理を行わずそのまま返るようになっている点にも注目してください。これにより、無効な入力に対しても安全に動作します。

  1. 循環リンクリスト内の要素を検索するPythonプログラム

    循環リンクリストとは循環リンクリスト(Circular Linked List)は、通常のリンクリストと異なり、最後のノードが先頭ノードに接続されているデータ構造です。そのため、リスト内に「NULL」で終わるノードが存在せず、head(先頭)とtail(末尾)が互いに隣接し、円を形成するように連結されています。循環リンクリスト内の特定の要素を検索するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納されるデータと、次のノードへの参照という2つの属性を持たせます。さらに、初期化関数を持つ別のクラスを作成し、headノードを「None」で初期化します。そして、リスト

  2. 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つずつ前へ進めま