【れんけつりすと】

連結リスト とは?

最終更新:
💡 鎖のように「次はあっちだよ」と繋がっているデータの列

データを持つノードが、次のノードへの参照(ポインタ)で鎖状につながるデータ構造。必要なノードが分かれば参照の付け替えで挿入・削除できるが、位置を探すには順にたどる必要がある。

📌 このページのポイント
次の参照をたどるデータの列 単方向の例:head → A A next B next C next C.next = null Aの後ろへXを挿入 A next X next B next C next ① X.next を B へ ② A.next を X へ Aが分かっていれば付け替えは O(1) 位置を探す時間は別:最悪 O(n) 単方向の末尾削除は直前の探索が必要
A→B→Cを、A→X→B→Cへつなぎ替える。矢印はnextの参照でノードの輪郭へ接続。図の横並びはメモリ上の連続配置を意味しない。
ひよこ ひよこ
連結リストって配列と何が違うの?
ペンギン先生 ペンギン先生
配列のように番号から直接要素へアクセスする代わりに、先頭などから次の参照をたどるよ。ノードはメモリ上で連続している必要がない。ただし参照を保存する領域が増え、順にたどる処理も必要なので、配列よりいつも速いわけではないんだ。
ひよこ ひよこ
どんな時に連結リストが便利なの?
ペンギン先生 ペンギン先生
挿入場所の直前のノードが分かっているなら、新しいノードのnextを後ろへ向け、直前のnextを新ノードへ向ける、といった付け替えで挿入できる。場所を探す時間は別で、番号で指定すると最悪O(n)かかる。削除でも必要な参照を用意するんだ。
ひよこ ひよこ
末尾の追加や削除もいつもO(1)なの?
ペンギン先生 ペンギン先生
単方向でも末尾への参照を持てば、末尾追加の付け替えはO(1)だよ。でも末尾削除は、その直前を探すために先頭からたどる場合がある。双方向で末尾への参照もあれば、前をすぐ取得して削除できる。どの参照を持つ実装かが大切だね。
ひよこ ひよこ
実際のプログラミングで使う場面は?
ペンギン先生 ペンギン先生
スタックやキューを作る方法の一つだよ。JavaのLinkedListは双方向連結リストで、番号でアクセスすると近い側の端からたどる。CPython 3.13のcollections.dequeは、要素ごとのノードではなく固定長ブロックを双方向につなぐ実装。教科書の単純なリストと同一とはしないんだ。
ひよこ ひよこ
ペンギン先生 ペンギン先生
次だけでなく前のノードへの参照も持つので、逆向きにもたどれるよ。挿入や削除では両側の参照を正しく更新する必要がある。ノードが分かれば速く付け替えられるけれど、番号指定で探す時間は残る。単方向より参照の保存や更新も増えるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「連結リスト」って出てきたら「次の要素の場所を記録しながら鎖状につながるデータ構造」と思えばだいたいOK!
📖 おまけ:英語の意味
「Linked List」 = 連結されたリスト
💬 Linkは「つなぐ」、Listは「一覧」。ノードの参照をたどると、離れた場所のデータも一つの列として扱える、というイメージだよ

参考資料

← 用語集にもどる