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):
        self.helper_reverse_display(self.head)

    def helper_reverse_display(self, curr):
        if curr is None:
            return

        self.helper_reverse_display(curr.next)
        print(curr.data)

my_instance = my_linked_list()
n = int(input('How many elements you wish to add ? '))
for i in range(n):
    data = int(input('Enter the data item : '))
    my_instance.add_value(data)

print('The reversed linked list is: ')
my_instance.reverse_display()

出力結果

How many elements you wish to add ? 4
Enter the data item : 21
Enter the data item : 34
Enter the data item : 56
Enter the data item : 68
The reversed linked list is:
68
56
34
21

コードの解説

  • まず、ノードを表す「Node」クラスを作成します。

  • 次に、必要な属性を持つ「my_linked_list」クラスを作成します。

  • 「__init__」関数では、先頭ノードを指す「head」と最終ノードを指す「last_node」を「None」で初期化します。

  • 「add_value」メソッドは、リンクリストの末尾に新しいデータを追加するために使用します。

  • 「reverse_display」メソッドは、リンクリストの内容をコンソールに逆順で表示するための入り口となるメソッドです。

  • 再帰処理を行うために、ヘルパー関数「helper_reverse_display」を別途定義しています。

  • 「reverse_display」からヘルパー関数が呼び出され、ヘルパー関数は自分自身を再帰的に呼び出しながら処理を進めます。

  • 再帰呼び出しはリストの末尾(None)に到達すると停止し、呼び出し元へ戻りながら各ノードのデータを順に出力します。これにより、特別な反転処理を書かずとも自然に逆順表示が実現できます。

  • 「my_linked_list」クラスのインスタンスを作成します。

  • ユーザーから追加する要素の個数を入力として受け取ります。

  • forループで指定された回数だけ反復処理を行い、各データ項目をリンクリストに追加していきます。

  • 最後に「reverse_display」メソッドを呼び出し、逆順に並べられたリンクリストをコンソールに表示します。

補足:再帰処理のポイント

このプログラムでは、再帰呼び出しがリストの末尾に到達した後、スタックを巻き戻すタイミングで print 文が実行されるため、逆順の出力が得られます。ただし、要素数が非常に多い場合は再帰の深さが増し、Python の再帰上限(デフォルトで約1000回)に達する可能性がある点には注意してください。そのようなケースでは、ループによる反転処理やスタックの活用を検討するとよいでしょう。

  1. C言語で単方向リンクリストを使って数値を逆順に表示する方法

    リンクリスト(連結リスト)とは リンクリストは動的メモリ割り当てを利用するデータ構造で、複数の「ノード」が連なった集合体です。各ノードはデータ部分とリンク部分(次のノードへのポインタ)の2つの要素で構成されています。 リンクリストの種類 C言語で扱われる主なリンクリストには、以下の4種類があります。 単方向リンクリスト 双方向リンクリスト 循環単方向リンクリスト 循環双方向リンクリスト 単方向リンクリストの構造 下の図は、単方向リンクリストの構造を示したものです。各ノードがデータと次ノードへのポインタを持ち、末尾ノードのポインタはNULLを指します。 数値を逆順に表示するCプログラム 以

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