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

C++で連結リストの最後の要素を先頭に移動する方法

連結リストが与えられたとき、最後の要素を先頭(ヘッド)へ移動させる必要があります。まず、具体的な例を見てみましょう。

入力

1 -> 2 -> 3 -> 4 -> 5 -> NULL

出力

5 -> 1 -> 2 -> 3 -> 4 -> NULL

アルゴリズム

  • 連結リストを初期化します。

  • 連結リストが空であるか、ノードが1つしかない場合は、そのまま処理を終了して返します。
  • 連結リストの最後のノードと、後ろから2番目のノードを探します。

  • 最後のノードを新しいヘッド(先頭)として設定します。

  • 後ろから2番目のノードのリンク(nextポインタ)を更新します。

実装

以下は、上記のアルゴリズムをC++で実装したものです。

#include <bits/stdc++.h>
using namespace std;
struct Node {
    int data;
    struct Node* next;
};
// 最後のノードを先頭へ移動する関数
void moveLastNodeToFront(struct Node** head) {
    if (*head == NULL || (*head)->next == NULL) {
        return;
    }
    struct Node* secondLastNode = *head;
    struct Node* lastNode = *head;
    while (lastNode->next != NULL) {
        secondLastNode = lastNode;
        lastNode = lastNode->next;
    }
    secondLastNode->next = NULL;
    lastNode->next = *head;
    *head = lastNode;
}
// 新しいノードを先頭に追加する関数
void addNewNode(struct Node** head, int new_data) {
    struct Node* newNode = new Node;
    newNode->data = new_data;
    newNode->next = *head;
    *head = newNode;
}
// 連結リストを表示する関数
void printLinkedList(struct Node* node) {
    while (node != NULL) {
        cout << node->data << "->";
        node = node->next;
    }
    cout << "NULL" << endl;
}
int main() {
    struct Node* head = NULL;
    addNewNode(&head, 1);
    addNewNode(&head, 2);
    addNewNode(&head, 3);
    addNewNode(&head, 4);
    addNewNode(&head, 5);
    addNewNode(&head, 6);
    addNewNode(&head, 7);
    addNewNode(&head, 8);
    addNewNode(&head, 9);
    moveLastNodeToFront(&head);
    printLinkedList(head);
    return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

1->9->8->7->6->5->4->3->2->NULL

この出力について補足します。addNewNode関数は常にリストの先頭に新しいノードを挿入するため、挿入完了時点での初期リストは「9 -> 8 -> 7 -> ... -> 1」という順序になっています。そこで最後のノード「1」を先頭へ移動すると、「1 -> 9 -> 8 -> ... -> 2」という結果になります。

なお、このアルゴリズムはリストを一度だけ走査すればよいため、計算量は O(n) です(n は連結リストのノード数)。空のリストやノードが1つのみのリストに対しても安全に動作する点もポイントです。

  1. 【C++】連結リスト内で指定した数Kで割り切れる最大要素と最小要素を求める方法

    連結リストとは 連結リスト(リンクリスト)は、要素同士がポインタで連結された線形データ構造です。各要素(ノード)は「データ部分」と「次の要素を指すリンク(ポインタ)」を持ち、メモリ上の連続していない場所に配置されることもあります。 本記事では、データ部分と次ノードへのリンクを持つ片方向連結リストと、整数Kが与えられます。目的は、連結リスト内の要素のうち「Kで割り切れる」要素の最大値と最小値を見つけることです。線形連結リストは一方向にしか走査できないため、ヘッド(先頭)ノードから順に各ノードを訪問し、そのデータ部分がKで割り切れるかどうかを判定します。現在のノードの値が、それまでに見つかった最

  2. C++で連結リストの末尾N個のノードの積を求める方法

    連結リスト(リンクリスト)に複数の要素が格納されている場合を考えてみましょう。この記事では、リストの末尾からN個の要素を取り出し、それらの積(掛け算の結果)を求める方法を解説します。Nの値はあらかじめ与えられているものとします。例えば、連結リストが [5, 7, 3, 5, 6, 9] という構成で、n = 3 が与えられた場合、末尾の3つの要素は 5、6、9 となるため、計算結果は 5 × 6 × 9 = 270 になります。アルゴリズムの考え方この問題の解き方は非常にシンプルです。連結リストは基本的に先頭から順方向にしか辿れないため、スタック(stack)を活用します。手順は以下の通りです