C++で連結リストがペアごとにソートされているか判定する方法
ペアごとのソート判定とは
n個の要素を持つ連結リストLが与えられたとき、そのリストが「ペアごとにソートされているか」を判定します。たとえば、リストが {8, 10, 18, 20, 5, 15} である場合、(8, 10)、(18, 20)、(5, 15) の各ペアがいずれも昇順に並んでいるため、このリストはペアごとにソートされていると判断できます。要素数が奇数の場合は、ペアをなさない最後の1要素が無視されます。
アルゴリズムの考え方
アプローチは非常にシンプルです。リストを先頭から順に走査し、隣接する2つの要素を1組のペアとして取り出して、それぞれのペアが昇順に並んでいるかを確認します。ソートされていないペアが1つでも見つかった時点でfalseを返し、すべてのペアが正しくソートされていればtrueを返します。
処理手順
- 先頭ノードから走査を開始します。
- 現在のノードと次のノードの値を比較します。
- 現在の値が次の値より大きい場合、そのペアはソートされていないためfalseを返します。
- 問題がなければ、2ノード分先へ移動して次のペアを確認します。
- リストの終端に達したらtrueを返します。
C++による実装例
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
};
// リストの末尾にノードを追加する
void append(Node** head, int key) {
Node* new_node = new Node;
new_node->data = key;
new_node->next = NULL;
if (*head == NULL) {
*head = new_node;
return;
}
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
// リストがペアごとにソートされているか判定する
bool isPairwiseSorted(Node* head) {
Node* temp = head;
while (temp != NULL && temp->next != NULL) {
// ペアが昇順でない場合はfalseを返す
if (temp->data > temp->next->data) {
return false;
}
temp = temp->next->next;
}
return true;
}
int main() {
Node* head = NULL;
int arr[] = {8, 10, 18, 20, 5, 15};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++) {
append(&head, arr[i]);
}
if (isPairwiseSorted(head)) {
cout << "This is pairwise sorted" << endl;
} else {
cout << "This is not pairwise sorted" << endl;
}
return 0;
}実行結果
This is pairwise sorted
計算量
時間計算量はO(n)(nはリストの要素数)です。リストを一度だけ走査すればよいため、非常に効率的なアルゴリズムです。また、追加の作業用メモリを必要としないため、空間計算量はO(1)となります。
-
C++でマルチレベル連結リストをフラット化する方法を解説
この記事では、マルチレベル連結リスト(Multilevel Linked List)をフラット化するプログラムをC++で作成する方法について解説します。フラット化とは、第1レベルのノードをすべて先に並べ、その後に第2レベルのノードが続くように、階層構造を持つリストを1本の直線的な連結リストへ変換する操作のことです。マルチレベル連結リストとはマルチレベル連結リストとは、多次元的なデータ構造の一種です。各ノードは2つのポインタを持ちます。1つは次のノードを指す「next」ポインタ、もう1つは1つ以上のノードからなる子リストを指す「child」ポインタです。この子ポインタは、他のリストのノードを指す
-
C++でソート・回転済み連結リストの回転数を求める方法
問題概要ある連結リストが与えられます。このリストは、最初に昇順にソートされ、その後 K 個のノード分だけ回転(ローテーション)されたものです。この記事の目的は、元のリストに対する回転数 K を求めることです。たとえば、以下のような連結リストが入力として与えられたとします。5 → 7 → 9 → 1 → 3このリストは、元のソート済みリスト1 → 3 → 5 → 7 → 9を 2 ノード分だけ回転したものになっています。つまり、この場合の K は 2 です。具体例で理解する例 1入力: リスト: 5 → 7 → 9 → 1 → 3出力:連結リストの要素: 5 7 9 1 3ソート・回転済み連結リ