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

C++で指定した位置の連結リストノードを削除する方法

はじめに

このチュートリアルでは、単方向連結リスト(Singly Linked List)から、指定された位置にあるノードを削除する方法を解説します。まずは、問題を解決するための手順を確認していきましょう。

解決の手順

  • データ(data)と次ノードへのポインタ(next)を持つ構造体を定義します。

  • ノードを単方向連結リストの先頭に挿入する関数を作成します。

  • ダミーデータを使って単方向連結リストを初期化します。

  • 削除対象ノードの位置を指定します。

  • 連結リストを走査し、指定された位置にあるノードを特定します。

  • ノードを削除する関数を作成します。削除処理では、以下の3つのケースを考慮する必要があります。

    • 先頭ノードの場合:headポインタを次のノードへ移動します。

    • 中間ノードの場合:前のノードのリンクを、その次のノードにつなぎ替えます。

    • 末尾ノードの場合:前のノードからのリンクを解除します。

サンプルコード

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;

// データと次ノードへのポインタを持つ構造体
struct Node {
    int data;
    struct Node *next;
};

// リストの先頭に新しいノードを挿入する関数
void insertNode(struct Node** head_ref, int new_data) {
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

// 指定された位置のノードを削除する関数
void deleteNode(struct Node **head_ref, int position) {
    // リストが空の場合は何もしない
    if (*head_ref == NULL) {
        return;
    }
    struct Node* temp = *head_ref;
    // ケース1:先頭ノードを削除する場合
    if (position == 1) {
        *head_ref = temp->next;
        free(temp);
        return;
    }
    // 削除対象ノードの直前まで移動する
    for (int i = 2; temp != NULL && i < position; i++) {
        temp = temp->next;
    }
    // 指定位置がリストの長さを超える場合は何もしない
    if (temp == NULL || temp->next == NULL) {
        return;
    }
    // ケース2・3:中間または末尾ノードを削除する場合
    struct Node *next = temp->next->next;
    free(temp->next);
    temp->next = next;
}

// 連結リストの内容を表示する関数
void printLinkedList(struct Node *node) {
    while (node != NULL) {
        cout << node->data << "->";
        node = node->next;
    }
}

int main() {
    struct Node* head = NULL;
    insertNode(&head, 1);
    insertNode(&head, 2);
    insertNode(&head, 3);
    insertNode(&head, 4);
    insertNode(&head, 5);
    cout << "Linked list before deletion:" << endl;
    printLinkedList(head);
    deleteNode(&head, 1);
    cout << "\nLinked list after deletion:" << endl;
    printLinkedList(head);
    return 0;
}

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。

Linked list before deletion:
5->4->3->2->1->
Linked list after deletion:
4->3->2->1->

まとめ

このチュートリアルでは、単方向連結リストから指定した位置のノードを削除する方法を学びました。重要なのは、削除対象が先頭・中間・末尾のどれに該当するかを判定し、それぞれに応じてポインタを適切につなぎ替えることです。特に先頭ノードを削除する場合は、headポインタ自体を更新する必要がある点に注意しましょう。

本チュートリアルについてご不明な点や質問がある場合は、ぜひコメント欄でお知らせください。

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

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

  2. Pythonで連結リストのノードを削除する方法

    連結リスト(リンクリスト)にいくつかの要素が格納されているとします。ここでの課題は、指定されたノードをリストから削除する関数を作成することです。例えば、リストが 1 → 3 → 5 → 7 → 9 の場合、値 3 を削除すると、結果は 1 → 5 → 7 → 9 になります。削除の基本的な考え方削除したいノードを指すポインタ「node」が与えられている場合、以下の2つの操作を実行することでノードを削除できます。node.val = node.next.val — 次のノードの値を現在のノードにコピーするnode.next = node.next.next — 現在のノードの参照先を、次の次のノ