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

C++で連結リストがペアごとにソートされているか判定する方法

ペアごとのソート判定とは

n個の要素を持つ連結リストLが与えられたとき、そのリストが「ペアごとにソートされているか」を判定します。たとえば、リストが {8, 10, 18, 20, 5, 15} である場合、(8, 10)、(18, 20)、(5, 15) の各ペアがいずれも昇順に並んでいるため、このリストはペアごとにソートされていると判断できます。要素数が奇数の場合は、ペアをなさない最後の1要素が無視されます。

アルゴリズムの考え方

アプローチは非常にシンプルです。リストを先頭から順に走査し、隣接する2つの要素を1組のペアとして取り出して、それぞれのペアが昇順に並んでいるかを確認します。ソートされていないペアが1つでも見つかった時点でfalseを返し、すべてのペアが正しくソートされていればtrueを返します。

処理手順

  1. 先頭ノードから走査を開始します。
  2. 現在のノードと次のノードの値を比較します。
  3. 現在の値が次の値より大きい場合、そのペアはソートされていないためfalseを返します。
  4. 問題がなければ、2ノード分先へ移動して次のペアを確認します。
  5. リストの終端に達したら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)となります。


  1. C++でマルチレベル連結リストをフラット化する方法を解説

    この記事では、マルチレベル連結リスト(Multilevel Linked List)をフラット化するプログラムをC++で作成する方法について解説します。フラット化とは、第1レベルのノードをすべて先に並べ、その後に第2レベルのノードが続くように、階層構造を持つリストを1本の直線的な連結リストへ変換する操作のことです。マルチレベル連結リストとはマルチレベル連結リストとは、多次元的なデータ構造の一種です。各ノードは2つのポインタを持ちます。1つは次のノードを指す「next」ポインタ、もう1つは1つ以上のノードからなる子リストを指す「child」ポインタです。この子ポインタは、他のリストのノードを指す

  2. 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ソート・回転済み連結リ