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__メソッドにより、リストの先頭要素であるheadをNoneとして初期化します。あわせて末尾ノードlast_nodeも管理することで、要素の追加を効率化しています。add_valsメソッド: リストの末尾に新しい値を追加するためのメソッドです。リストが空の場合は新規ノードを
headに設定し、そうでなければ末尾ノードのnextに接続します。print_itメソッド: 連結リストの全要素を順番にコンソールへ表示するためのメソッドです。
reverse_listメソッド: 本記事の核心となる部分です。3つのポインタ(
before_val、curr、after_val)を使いながらリストを走査し、先頭からN個分のノードの向きを一つずつ付け替えていくことで、部分反転を実現します。Nが0の場合やリストが空の場合は何もせずに終了する安全策も組み込まれています。インスタンスの生成と入力:
LinkedList_structureのインスタンスを作成し、ユーザーから入力された値を順に連結リストへ追加します。反転数の指定: 反転したい要素の個数Nをユーザーから受け取ります。
実行と結果表示:
reverse_listメソッドを呼び出して反転処理を行い、その結果をコンソールに出力します。
この例では、「45 67 89 12 345」という5つの要素を持つ連結リストに対して、先頭3つの要素を反転するよう指定しています。その結果、「89 67 45 12 345」というリストが出力され、先頭部分だけが正しく逆順になっていることが確認できます。
-
Pythonで連結リストを反転する方法|再帰を使った実装をわかりやすく解説
連結リスト(リンクリスト)が与えられたとき、それを逆順に並べ替えることを考えます。たとえば、リストが 1 → 3 → 5 → 7 の場合、反転後の新しいリストは 7 → 5 → 3 → 1 となります。 解き方のアプローチ この問題は、再帰を使った手順「solve(head, back)」を定義することで解決できます。具体的な流れは以下のとおりです。 リストの反転を再帰的に行う手順 solve(head, back) を定義する head が存在しない場合は、head をそのまま返す temp := head.next として、次のノードを一時的に保存する head.next := back
-
Pythonでリストの最初と最後の要素を交換する方法:4つのアプローチを徹底解説
はじめにこの記事では、リストの最初の要素と最後の要素を入れ替えるという問題に対する解決策を、4つの異なるアプローチで解説します。問題の定義与えられたリストに対して、最後の要素を最初の要素と入れ替える処理を実装します。例えば、[t, u, t, o, r, i, a, l] というリストが与えられた場合、実行後は [l, u, t, o, r, i, a, t] のように、先頭と末尾の要素が入れ替わります。それでは、以下の4つのアプローチを順番に見ていきましょう。アプローチ1:一時変数を使う基本的な方法最も基本的な方法です。リストの長さを取得し、一時変数(temp)を使って最初の要素と最後の要素