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

Pythonで連結リストの先頭N個の要素だけを反転するプログラム

連結リスト(リンクリスト)の中から、指定した範囲の要素だけを反転したい場面はよくあります。本記事では、reverse_list というメソッドを定義し、リストを走査しながら先頭のN個の要素のみを逆順に並べ替える方法を解説します。

それでは、実際のコード例を見ていきましょう。

サンプルコード

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

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

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

    def print_it(self):
        curr = self.head
        while curr:
            print(curr.data)
            curr = curr.next

def reverse_list(my_list, n):
    if n == 0:
        return
    before_val = None
    curr = my_list.head
    if curr is None:
        return
    after_val = curr.next
    for i in range(n):
        curr.next = before_val
        before_val = curr
        curr = after_val
        if after_val is None:
            break
        after_val = after_val.next
    my_list.head.next = curr
    my_list.head = before_val

my_instance = LinkedList_structure()
my_list = input('Enter the elements of the linked list... ').split()
for elem in my_list:
    my_instance.add_vals(int(elem))
n = int(input('Enter the number of elements you wish to reverse in the list... '))

reverse_list(my_instance, n)

print('The new list is : ')
my_instance.print_it()

実行結果

Enter the elements of the linked list... 45 67 89 12 345
Enter the number of elements you wish to reverse in the list... 3
The new list is :
89
67
45
12
345

コードの解説

  • Nodeクラスの作成: まず、連結リストの各ノードを表す Node クラスを作成します。各ノードはデータ(data)と次のノードへの参照(next)を持ちます。

  • LinkedList_structureクラスの作成: 次に、必要な属性を持つ LinkedList_structure クラスを定義します。

  • 初期化処理: __init__ メソッドにより、リストの先頭要素である headNone として初期化します。あわせて末尾ノード last_node も管理することで、要素の追加を効率化しています。

  • add_valsメソッド: リストの末尾に新しい値を追加するためのメソッドです。リストが空の場合は新規ノードを head に設定し、そうでなければ末尾ノードの next に接続します。

  • print_itメソッド: 連結リストの全要素を順番にコンソールへ表示するためのメソッドです。

  • reverse_listメソッド: 本記事の核心となる部分です。3つのポインタ(before_valcurrafter_val)を使いながらリストを走査し、先頭からN個分のノードの向きを一つずつ付け替えていくことで、部分反転を実現します。Nが0の場合やリストが空の場合は何もせずに終了する安全策も組み込まれています。

  • インスタンスの生成と入力: LinkedList_structure のインスタンスを作成し、ユーザーから入力された値を順に連結リストへ追加します。

  • 反転数の指定: 反転したい要素の個数Nをユーザーから受け取ります。

  • 実行と結果表示: reverse_list メソッドを呼び出して反転処理を行い、その結果をコンソールに出力します。

この例では、「45 67 89 12 345」という5つの要素を持つ連結リストに対して、先頭3つの要素を反転するよう指定しています。その結果、「89 67 45 12 345」というリストが出力され、先頭部分だけが正しく逆順になっていることが確認できます。

  1. Pythonで連結リストを反転する方法|再帰を使った実装をわかりやすく解説

    連結リスト(リンクリスト)が与えられたとき、それを逆順に並べ替えることを考えます。たとえば、リストが 1 → 3 → 5 → 7 の場合、反転後の新しいリストは 7 → 5 → 3 → 1 となります。 解き方のアプローチ この問題は、再帰を使った手順「solve(head, back)」を定義することで解決できます。具体的な流れは以下のとおりです。 リストの反転を再帰的に行う手順 solve(head, back) を定義する head が存在しない場合は、head をそのまま返す temp := head.next として、次のノードを一時的に保存する head.next := back

  2. Pythonでリストの最初と最後の要素を交換する方法:4つのアプローチを徹底解説

    はじめにこの記事では、リストの最初の要素と最後の要素を入れ替えるという問題に対する解決策を、4つの異なるアプローチで解説します。問題の定義与えられたリストに対して、最後の要素を最初の要素と入れ替える処理を実装します。例えば、[t, u, t, o, r, i, a, l] というリストが与えられた場合、実行後は [l, u, t, o, r, i, a, t] のように、先頭と末尾の要素が入れ替わります。それでは、以下の4つのアプローチを順番に見ていきましょう。アプローチ1:一時変数を使う基本的な方法最も基本的な方法です。リストの長さを取得し、一時変数(temp)を使って最初の要素と最後の要素