C++で片方向連結リスト内の最小値と最大値の要素を検索する方法
問題概要
この問題では、片方向連結リスト(単一リンクリスト)が与えられます。私たちのタスクは、リンクリスト内に存在する最小の要素と最大の要素を見つけることです。
問題を理解するための例を見てみましょう
入力
linked List : 5 -> 2 -> 7 -> 3 -> 9 -> 1 -> 4
出力
Smallest element = 1 Largest element = 9
解決アプローチ
この問題に対するシンプルな解決策は、リンクリストを先頭からノードごとに走査することです。手順は以下の通りです。
- まず、
minElementとmaxElementを最初の要素の値(head->data)で初期化します。 - 次に、リンクリストを1要素ずつ走査していきます。
- 現在のノードの値を
maxElementと比較し、より大きい値をmaxElement変数に格納します。 - 同じ要領で、より小さい値を
minElement変数に格納します。 - 走査が完了したら、両方の値を出力します。
リンクリスト全体を一度だけ走査すればよいため、時間計算量は O(n)、追加のメモリは不要で空間計算量は O(1) となります。
ソリューションの動作を示すプログラム
例
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
void printLargestSmallestLinkedList(struct Node* head) {
int maxElement = INT_MIN;
int minElement = INT_MAX;
while (head != NULL) {
if (minElement > head->data)
minElement = head->data;
if (maxElement < head->data)
maxElement = head->data;
head = head->next;
}
cout<<"Smallest element in the linked list is : "<<minElement<<endl;
cout<<"Largest element in the linked list is : "<<maxElement<<endl;
}
void push(struct Node** head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = (*head);
(*head) = newNode;
}
int main() {
struct Node* head = NULL;
push(&head, 5);
push(&head, 2);
push(&head, 7);
push(&head, 3);
push(&head, 9);
push(&head, 1);
push(&head, 4);
printLargestSmallestLinkedList(head);
return 0;
}出力
Smallest element in the linked list is : 1 Largest element in the linked list is : 9
まとめ
片方向連結リストの最小値と最大値を求めるには、リンクリストを先頭から末尾まで一度だけ走査し、各ノードの値を現在の最小値・最大値と比較して更新していくのが最も効率的な方法です。計算量は O(n) であり、リンクリストの基本的な走査パターンを学ぶのに最適な問題と言えます。
-
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ソート・回転済み連結リ
-
C++で単方向連結リストを奇数・偶数が交互に並ぶよう並べ替える方法
単方向連結リスト(シングルリンクリスト)は、「データ」と「次の要素へのポインタ」の2つの部分から構成される線形データ構造です。 奇数・偶数が交互に並ぶ連結リストとは? 奇数・偶数交互連結リストとは、あるノードのデータが偶数であれば、その隣のノードのデータは奇数になるように並んだ連結リストのことを指します。 本記事では、既存の単方向連結リストを、以下のいずれかの形式に並べ替える問題を扱います。 先頭が偶数の場合:1番目が偶数、2番目が奇数、3番目が偶数…という順序で並べる 先頭が奇数の場合:1番目が奇数、2番目が偶数、3番目が奇数…という順序で並べる 具体例で理解しよう 例として、次の連