C++で連結リストの先頭k個のノードの積を求める方法
連結リストに複数の要素が格納されている場合を考えます。このとき、先頭からk個の要素の積(乗算結果)を求める必要があります。kの値もあらかじめ与えられているものとします。
例えば、連結リストが [5, 7, 3, 5, 6, 9] で、k = 3 である場合、計算結果は 5 × 7 × 3 = 105 となります。
アルゴリズムの考え方
処理の手順は非常にシンプルです。連結リストを左(先頭)から順に走査し、現在のノードの値を結果変数に掛けていきます。結果変数の初期値は 1 に設定しておきます。k個の要素を処理し終えた時点で走査を終了し、その時点での積を返します。
このアルゴリズムの計算量は O(k) であり、連結リスト全体を走査する必要がないため、リストが長い場合でも効率的に処理できます。また、積が大きな値になる可能性を考慮し、結果は long long 型で保持しています。
C++での実装例
#include<iostream>
#include<cmath>
using namespace std;
class Node {
public:
int data;
Node *next;
};
Node* getNode(int data) {
Node *newNode = new Node;
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void append(struct Node** start, int key) {
Node* new_node = getNode(key);
Node *p = (*start);
if (p == NULL) {
(*start) = new_node;
return;
}
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
long long prodFirstKElements(Node *start, int k) {
long long res = 1;
int count = 0;
Node* temp = start;
while (temp != NULL && count != k) {
res *= temp->data;
count++;
temp = temp->next;
}
return res;
}
int main() {
Node *start = NULL;
int arr[] = {5, 7, 3, 5, 6, 9};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
for (int i = 0; i < n; i++) {
append(&start, arr[i]);
}
cout << "Product of first k elements: " << prodFirstKElements(start, k);
}実行結果
Product of first k elements: 105
コードの解説
このプログラムは以下の構成要素で成り立っています。
Nodeクラス: 連結リストの各ノードを表します。整数値を格納する data フィールドと、次のノードを指す next ポインタを持ちます。
append関数: リストの末尾に新しいノードを追加します。リストが空の場合は、新しいノードを先頭として設定します。
prodFirstKElements関数: 中核となる処理を行う関数です。結果変数 res を 1 で初期化し、カウンタ count が k に達するまで、またはリストの終端に到達するまで、各ノードの値を res に掛け続けます。
main関数: 配列の要素を連結リストに追加し、k = 3 として prodFirstKElements 関数を呼び出して結果を表示します。
注意点
リストの要素数がkより少ない場合でも、この実装はリストの終端(NULL)をチェックしているため、安全に動作し、存在する全要素の積を返します。また、要素の値が大きい場合や要素数が多い場合は、オーバーフローを防ぐために long long 型を使用している点にも注目してください。
-
C++で連結リストの交互ノードの合計を求める方法(反復法・再帰法)
問題概要 この記事では、連結リスト(リンクリスト)が与えられたときに、その交互ノード(0、2、4…番目のノード)の値の合計を求める方法を解説します。 連結リストとは、リンク(ポインタ)によって順次接続されたデータ構造の列です。各ノードはデータ本体と、次のノードを指す参照を持っています。 今回の課題は、連結リストのうち位置 0、2、4、6 … にあるノード、つまり先頭から1つおきのノードの値をすべて加算することです。 入出力例 入力: 4 → 12 → 10 → 76 → 9 → 26 → 1 出力: 24 説明: 交互ノードを取り出すと − 4 + 10 + 9 + 1 = 24 解決の考
-
C++で循環リンクリストのノード数をカウントする方法
ノードから構成される循環リンクリスト(Circular Linked List)が与えられ、そのリスト内に存在するノードの総数を求めるのが課題です。 循環リンクリストとは、連結リストの一種であり、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すという特徴を持つデータ構造です。片方向リンクリスト(Singly Linked List)でも双方向リンクリスト(Doubly Linked List)でも、この循環リンクリストとして実装することが可能です。 以下のプログラムでは、片方向リンクリストを循環リンクリストとして実装し、その中に含まれるノード数をカウントする方法を紹介します。 具体