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 print_it(self):
        curr = self.head
        while curr:
            print(curr.data)
            curr = curr.next

    def alternate_nodes(self):
        curr = self.head
        while curr:
            print(curr.data)
            if curr.next is not None:
                curr = curr.next.next
            else:
                break

my_instance = my_linked_list()
my_list = input("Enter the elements of the linked list :").split()
for elem in my_list:
    my_instance.add_value(elem)
print("The alternate elements in the linked list are :")
my_instance.alternate_nodes()

出力結果

Enter the elements of the linked list :56 78 43 51 23 89 0 6
The alternate elements in the linked list are :
56
43
23
0

解説

  • まず「Node」クラスを作成します。このクラスはデータと次のノードへの参照を保持します。

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

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

  • 「add_value」メソッドを定義し、連結リストの末尾に新しいデータを追加できるようにします。リストが空の場合はheadに設定し、そうでなければlast_nodeのnextに接続します。

  • 「print_it」メソッドを定義し、リスト全体を走査してすべての要素を出力します。

  • 「alternate_nodes」メソッドを定義し、連結リストを1つおきに走査して交互の位置にある要素のみを出力します。ここでは再帰を使わず、whileループとポインタの2回進める操作だけで実現しています。

  • 「my_linked_list」クラスのオブジェクトを生成します。

  • ユーザーから入力を受け取り、各要素を連結リストに追加した後、「alternate_nodes」メソッドを呼び出して交互インデックスの要素を取得します。

  • 結果がコンソールに表示されます。

ポイント

再帰を使わないアプローチでは、現在のノードから「next.next」へ一度に2つ進むことで交互ノードを効率的に取得できます。これによりスタックオーバーフローのリスクを避けられ、長い連結リストでも安全に処理できます。計算量はO(n)、空間計算量はO(1)となります。

  1. 【C++】再帰を使ってリンクリストの交互ノードを出力する方法

    リンクリスト(連結リスト)とはリンクリストは、各要素(ノード)をメモリ上の連続しない領域に格納できる線形データ構造です。各ノードにはデータ本体と、次のノードを指すポインタが含まれており、ポインタをつなぐことで一連のリストとして扱うことができます。問題の概要今回は、与えられたリンクリストを走査し、交互(ひとつおき)のノードだけを出力するプログラムを作成します。具体的には、1番目・3番目・5番目…というように、奇数番目の要素のみを順に出力していきます。入出力例入力 : 2 -> 4 -> 1 -> 67 -> 48 -> 90 出力 : 2 -> 1 ->

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

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