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

C++で再帰を使ったリンクリストへの挿入と走査の実装方法

整数値が与えられ、それらを使って連結リスト(リンクリスト)を構築します。ここでの課題は、再帰的なアプローチを用いて、まず単方向連結リストの末尾にノードを挿入し、その後リスト全体を走査(トラバース)して表示することです。

再帰による末尾へのノード追加

  • headがNULLの場合 → 新しいノードをheadとして追加する

  • それ以外の場合 → head->nextに対して再帰的に追加処理を呼び出す

再帰によるノードの走査

  • headがNULLの場合 → NULLを出力して終了する

  • それ以外の場合 → 現在のデータを出力し、head->nextに対して再帰的に走査を続ける

実行例

入力:1 - 2 - 7 - 9 - 10

出力:連結リスト:1 → 2 → 7 → 9 → 10 → NULL

入力:12 - 21 - 17 - 94 - 18

出力:連結リスト:12 → 21 → 17 → 94 → 18 → NULL

プログラムで使用するアプローチ

このアプローチでは、ノードを追加する関数とリストを走査する関数をそれぞれ定義し、次のノードに対して自分自身を再帰的に呼び出すことで処理を実現します。

  • 整数型のdataメンバと、次ノードへのポインタSLLNode* nextを持つ構造体SLLNodeを定義します。

  • 関数addtoEnd(SLLNode* head, int data)は、リストの先頭ポインタと挿入するデータを受け取り、連結リストの末尾にノードを追加します。

  • headポインタがNULLの場合、リストは空であるため、新しいノードを作成してheadとして設定します。head->nextにはNULLを代入し、このノードへのポインタを返します。

  • headがNULLでない場合は、head->next = addtoEnd(head->next, data)のように再帰呼び出しを行い、リストの末尾まで辿ってからノードを追加します。

  • 関数traverseList(SLLNode* head)は、headから走査を開始し、各ノードの値を出力します。

  • headがNULLの場合は「NULL」を出力して処理を終了します。

  • それ以外の場合は現在のdataを出力し、traverseList(head->next)を呼び出して次のノードへ進みます。

  • main関数内ではaddtoEnd()を使ってリストを構築し、traverseList()を使ってリスト全体を表示します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
struct SLLNode {
    int data;
    SLLNode* next;
};
SLLNode* addtoEnd(SLLNode* head, int data){
    if (head == NULL){
        SLLNode *nodex = new SLLNode;
        nodex->data = data;
        nodex->next = NULL;
        return nodex;
    }
    else{
        head->next = addtoEnd(head->next, data);
    }
    return head;
}
void traverseList(SLLNode* head){
    if (head == NULL){
        cout << "NULL";
        return;
    }
    cout << head->data << " -> ";
    traverseList(head->next);
}
int main(){
    SLLNode* head1 = NULL;
    head1 = addtoEnd(head1, 1);
    head1 = addtoEnd(head1, 8);
    head1 = addtoEnd(head1, 56);
    head1 = addtoEnd(head1, 12);
    head1 = addtoEnd(head1, 34);
    cout<<"Linked List is :"<<endl;
    traverseList(head1);
    return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

Linked List is :
1 -> 8 -> 56 -> 12 -> 34 -> NULL

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

  2. C++で連結リストの交互ノードの合計を求める方法(反復法・再帰法)

    問題概要 この記事では、連結リスト(リンクリスト)が与えられたときに、その交互ノード(0、2、4…番目のノード)の値の合計を求める方法を解説します。 連結リストとは、リンク(ポインタ)によって順次接続されたデータ構造の列です。各ノードはデータ本体と、次のノードを指す参照を持っています。 今回の課題は、連結リストのうち位置 0、2、4、6 … にあるノード、つまり先頭から1つおきのノードの値をすべて加算することです。 入出力例 入力: 4 → 12 → 10 → 76 → 9 → 26 → 1 出力: 24 説明: 交互ノードを取り出すと − 4 + 10 + 9 + 1 = 24 解決の考