Pythonで循環リンクリストの要素をソートするプログラムの作り方
循環リンクリストの要素を並べ替える必要がある場合は、まず「Node」クラスを作成します。このクラスには、ノードに格納するデータと、リンクリスト上の次のノードへの参照という2つの属性が定義されています。
循環リンクリストの特徴は、先頭(ヘッド)と末尾(テール)が互いに隣接している点です。両者は円を形成するように接続されており、通常のリンクリストと異なり、最後のノードに「NULL」は存在しません。
続いて、初期化関数を持つ「linked_list」クラスを作成し、ノードの先頭を「None」に初期化します。
さらに、リンクリストへノードを追加するメソッド、リストを昇順・降順にソートするメソッド、ノードの値を出力するメソッドなど、目的に応じた複数のメソッドを定義して利用します。
以下に具体的な実装例を示します。
実装例
class Node:
def __init__(self,data):
self.data = data
self.next = None
class list_creation:
def __init__(self):
self.head = Node(None)
self.tail = Node(None)
self.head.next = self.tail
self.tail.next = self.head
def add_data(self,my_data):
new_node = Node(my_data)
if self.head.data is None:
self.head = new_node
self.tail = new_node
new_node.next = self.head
else:
self.tail.next = new_node
self.tail = new_node
self.tail.next = self.head
def sort_list(self):
curr = self.head
if(self.head == None):
print("The list is empty")
else:
while(True):
index_val = curr.next
while(index_val != self.head):
if(curr.data > index_val.data):
temp = curr.data
curr.data = index_val.data
index_val.data = temp
index_val = index_val.next
curr =curr.next
if(curr.next == self.head):
break;
def print_it(self):
curr = self.head
if self.head is None:
print("The list is empty");
return;
else:
print(curr.data)
while(curr.next != self.head):
curr = curr.next
print(curr.data)
print("\n")
class circular_linked_list:
my_cl = list_creation()
print("Nodes are being added to the list")
my_cl.add_data(21)
my_cl.add_data(54)
my_cl.add_data(78)
my_cl.add_data(99)
my_cl.add_data(27)
print("The list is :")
my_cl.print_it()
print("The list is being sorted")
my_cl.sort_list()
print("The sorted list is : ")
my_cl.print_it()
出力結果
Nodes are being added to the list The list is : 21 54 78 99 27 The list is being sorted The sorted list is : 21 27 54 78 99
コードの解説
- まず「Node」クラスを作成します。
- 必要な属性を持つ別のクラスを定義します。
- 「sort_list」というメソッドを定義し、循環リンクリストの要素を昇順または降順に並べ替えられるようにします。
- 「print_it」というメソッドを定義し、循環リンクリストのノードの内容を表示できるようにします。
- 「list_creation」クラスのオブジェクトを生成し、そのメソッドを呼び出してデータを追加します。
- 「init」メソッドでは、循環リンクリストの先頭ノードと末尾ノードをNoneに初期化します。
- 「sort_list」メソッドを呼び出すと、リスト全体を走査しながら、各ノードの値を比較し、値に基づいて適切な位置へ要素を入れ替えていきます。
- 最後に「print_it」メソッドを使って、ソート後の結果をコンソールに出力します。
このように、ノード同士の値を比較しながら入れ替えていくシンプルな手法(選択ソートに近い考え方)を用いることで、循環リンクリストでも容易に要素を並べ替えることができます。NULL終端がない分、ループの終了条件として「先頭ノードに戻ってきたかどうか」を判定する点が、通常のリンクリストとの大きな違いです。
-
【Python】文字列の長さに基づいてリストを並べ替える方法
文字列のリストがあり、その長さを基準にリストを並べ替えたいとします。つまり、短い文字列から長い文字列へと昇順に整列させる必要があります。これを実現するには、独自のアルゴリズムを書くか、Pythonの組み込みメソッドであるsort()や関数sorted()を、キー(key)引数と組み合わせて使用するのが便利です。実行例まず、どのような動作になるのか例で確認しましょう。入力: strings = [hafeez, aslan, honey, appi] 出力: [appi, aslan, honey, hafeez]それでは、sorted(key)関数とsort(key)メソッドを使ったプログラム
-
要素の長さに基づいてリストをソートするPythonプログラム
この記事では、ユーザーが入力したリストを、各要素の長さ(文字数)に基づいてソートする方法を解説します。Pythonには標準で用意されている組み込み関数 sorted() を使うことで、シンプルなコードで実現できます。 例 入力::[mona,pp,aaa] それぞれの長さは [4,2,3] したがって、ソート後の並び順は [2,3,4] 出力::[pp,aaa,mona] アルゴリズム ステップ1: リストの要素を入力する。 ステップ2: sorted(A, key=len) 関数を適用する。 サンプルコード # リストをソートする def sortedlist(A): ne