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

再帰を使わずにリンクリストのノードを逆順に表示するPythonプログラム

リンクリスト(連結リスト)のノードを、再帰処理を使わずに逆順で表示したい場合があります。そのようなときは、リンクリストに要素を追加するメソッドと、要素を逆順に表示するメソッドをそれぞれ定義することで実現できます。

本記事では、再帰に頼らない逆順表示の実装方法を、具体的なコード例とともに詳しく解説します。

コード例

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

class my_linked_list:
    def __init__(self):
        self.head = None
        self.last_node = None

    def add_value(self, my_data):
        if self.last_node is None:
            self.head = Node(my_data)
            self.last_node = self.head
        else:
            self.last_node.next = Node(my_data)
            self.last_node = self.last_node.next

    def reverse_display(self):
        end_node = None
        while end_node != self.head:
            curr = self.head
            while curr.next != end_node:
                curr = curr.next
            print(curr.data)
            end_node = curr

my_instance = my_linked_list()
n = int(input('How many elements you wish to add ? '))
for i in range(n):
    data = int(input('Enter a data item : '))
    my_instance.add_value(data)
print('The reversed linked list is : ')
my_instance.reverse_display()

実行結果

How many elements you wish to add ? 5
Enter a data item : 43
Enter a data item : 67
Enter a data item : 87
Enter a data item : 12
Enter a data item : 34
The reversed linked list is :
34
12
87
67
43

コードの解説

  • まず、ノードを表す「Node」クラスを作成します。このクラスはデータ本体(data)と次のノードへの参照(next)を持ちます。
  • 次に、必要な属性を持つ「my_linked_list」クラスを作成します。
  • このクラスには「__init__」関数が定義されており、先頭ノードを表す「head」と末尾ノードを表す「last_node」を初期値「None」で初期化します。
  • 「add_value」というメソッドを定義し、これを使ってリンクリストへ新しいデータを追加できるようにします。リストが空の場合はheadに新ノードを設定し、そうでなければ末尾に接続します。
  • さらに「reverse_display」というメソッドを定義し、リンクリストのデータをコンソール上に逆順で表示します。このメソッドでは、毎回先頭から走査して末尾側の未出力ノードまで進み、そこに到達した時点でデータを出力するという二重ループの手法を採用しています。
  • 「my_linked_list」クラスのインスタンス(オブジェクト)を生成します。
  • ユーザーからの入力として、リンクリストに格納する要素数を受け取ります。
  • 入力された回数だけループを繰り返し、各要素を「add_value」メソッドでリストに追加していきます。
  • 最後に「reverse_display」メソッドを呼び出して要素を逆順に並べ替えた状態でコンソールに出力します。

補足:計算量について

この実装では、ノードを1つ表示するたびにリストの先頭から走査し直すため、時間計算量はO(n²)となります。要素数が多い場合は効率が低下するため、実際の開発ではノードの参照を反転させる方法や、スタックを利用する方法など、O(n)で処理できるアプローチも検討するとよいでしょう。ただし、再帰を使いたくない場面や学習目的においては、本記事のようなシンプルな二重ループによる実装はアルゴリズムの理解に役立ちます。

  1. Pythonでn個のノードを持つ双方向リンクリストを作成し、ノード数をカウントする方法

    双方向リンクリスト(ダブルリンクリスト)のノード数をカウントするには、まず「Node」クラスを作成する必要があります。このクラスには3つの属性を定義します。ノードが保持するデータ(data)、次のノードへの参照(next)、そして前のノードへの参照(prev)です。双方向リンクリストでは、各ノードがポインタを持ちます。現在のノードは、次のノードと前のノードの両方へのポインタを保持しています。リストの末尾にあるノードは、nextポインタに「NULL」(Pythonでは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つずつ前へ進めま