リスト構造とポインタ(linked list / pointer)

分類
テクノロジ系 アルゴリズムとプログラミング
出る試験
基本情報応用情報
重要度
★★★★☆

データ1つずつに「次がどこにあるか」を持たせてつないだ並べ方。途中の出し入れが速い。

もう少し詳しい説明

リスト構造は、データ1つずつに「次がどこにあるか」を持たせて、数珠つなぎにした並べ方です。

ポインタは、場所を指す値です。データそのものではなく、どこにあるかだけを持ちます。

まず、配列と比べる

比べる相手がないと、どこが利点なのかが見えません。配列から見ます。

配列は、同じ大きさの箱を、すきまなく並べて置いたものです。座席の並んだ映画館を思い浮かべてください。1番、2番、3番と番号が振られ、番号を確かめれば、その席へまっすぐ行けます。

これが速さの理由です。先頭の場所と、箱1つの大きさが分かっていれば、5番目の場所は計算で出ます。何番目であっても、かかる手間は同じです。

困るのは、途中に割り込ませたいときです。3番と4番のあいだに1人入れるには、4番以降の全員が1つずつ後ろへ移ることになります。100人並んでいれば97人が動きます。

リストは、場所を自由にする

次へ次へここで終わりデータA次は B へデータB次は C へデータC次は nullnull指す先が無い
箱の2行目を見てください。矢印の正体は、この「次がどこにあるか」という書き込みです。箱そのものは離れた場所に置かれていてよく、つながりはこの書き込みだけで作られています。最後の箱には次がないので、何も指していないという印が入ります。

リストは、箱を並べて置くことをやめます。

箱はばらばらの場所にあってよく、かわりにそれぞれが「次の箱はどこか」というメモを持ちます。上の図の2行目がそれです。このメモがポインタです。

宝探しにたとえます。1枚目の紙に「次は本棚の裏」と書いてあり、本棚の裏の紙に「次は机の下」と書いてある。紙どうしは離れた場所にあっても、順番は決まっています。

最後の箱には次がありません。ここには何も指していないという印を入れます。プログラムでは null(ヌル。何も指していないことを表す値)と書かれます。

割り込ませるのが速い

書き換え書き足しそのままデータA次は X へデータXあとから挟んだデータB触っていないデータC触っていない
もとは A の次が B でした。あいだに X を挟むために書き換えたのは、A の「次」と X の「次」の2か所だけです。B と C は中身も場所も触っていません。配列なら B 以降を全部ずらすことになります。

リストの強いところがここです。

AとBのあいだにXを挟むには、書き換えるのは2か所だけです。

  1. Xの「次」を、Bの場所にする
  2. Aの「次」を、Bの場所からXの場所へ書き換える

B以降には手を触れません。 100人並んでいても、動かすのは2か所です。配列のように、後ろの全員がずれることがありません。

削除も同じです。 Bを外したいなら、Aの「次」をCの場所に書き換えるだけで済みます。Bは誰からも指されなくなるので、列から消えます。1か所の書き換えで終わります。

代わりに失うもの

良いことばかりではありません。たとえば5番目を取り出す場面では、配列より時間がかかります。

配列なら計算で一発です。リストは先頭から順にたどることになります。1番目のメモを読んで2番目へ行き、2番目のメモを読んで3番目へ行く。5番目に着くまで、4回たどります。

100番目なら99回です。番号で一発に取り出すことができません。

もう1つ、メモを置く場所が余分に要ります。データ1つにつき、ポインタ1つぶんの領域が増えます。

表にして並べる

配列リスト
n番目を取り出す速い(計算で出る)遅い(先頭からたどる)
途中へ挿入・削除遅い(後ろをずらす)速い(2か所の書き換え)
余分な領域要らないポインタのぶん要る
置き場所連続していないと困るばらばらでよい

得意なことが、ちょうど逆になっています。 どちらが優れているという話ではなく、何をよくするかで選びます。

計算量(件数が増えたときに手間がどう伸びるか)の言い方では、n番目の取り出しが配列は O(1)、リストは O(n) です。挿入・削除は、場所が分かっていれば配列が O(n)、リストは O(1) になります。

3つの形

リストには、持たせるメモの数と向きで3つの形があります。

形持つメモできること
単方向リスト次だけ前から後ろへたどる
双方向リスト次と前後ろへも戻れる
環状リスト次(最後が先頭を指す)ぐるぐる回れる。終わりが無い

双方向リストは、戻れる代わりに書き換える場所が増えます。挿入のときは、前後それぞれの「次」と「前」を直すので、4か所になります。

環状リストは、最後の箱が先頭を指します。順番に処理を回し続けたい場面で使われます。

何の土台になっているか

リストは、ほかの構造の材料として使われます。

メモを何本持たせるか、どの向きに持たせるかを変えると、別の構造になります。リストは、その一番単純な形にあたります。

試験ではこう出る

科目A(旧・午前)のアルゴリズムとプログラミングで出ます。科目B(旧・午後)でも、擬似言語の中に出てきます。

いちばん多いのは、配列とリストの比較です。「途中への挿入・削除は速いが、n番目の参照は遅い」が答えの向きになります。どちらが速いかを入れ替えた選択肢が誤答として並びます。

次に多いのが、挿入のときに書き換えるポインタを選ばせる問題です。図を見せて「どの要素のポインタを、どこへ向けるか」を答えさせます。単方向なら2か所、双方向なら4か所という数を覚えておくと、選択肢を絞れます。

順番を間違えると壊れる点も問われます。先にAの「次」をXへ向けてしまうと、Bの場所が分からなくなります。新しい箱のメモを先に書き、つなぎ替えは後という順です。

応用情報では、環状リストや双方向リストの操作まで出ます。環状リストは「終わりの判定ができない」ことが問われます。先頭に戻ったかどうかを自分で覚えておく必要があります。

関連する用語

キュー
先に入れたものから先に出す構造。リストで作ることができる
スタック
後に入れたものから先に出す構造。これもリストで作れる
木構造
枝が分かれていく構造。子の場所を指すポインタを複数持たせた形にあたる
計算量
件数が増えたときの伸び方。配列とリストは、得意な操作が逆になる
値呼出しと参照呼出し
引数の渡し方。場所を渡すという考え方はポインタと同じ

ミニクイズ

単方向リスト(各要素が次の要素の場所だけを持つリスト)で、要素Aと要素Bのあいだに新しい要素Xを挿入するとき、行う必要がある操作はどれか。

正解は 3番:Xの「次」をBにし、Aの「次」をXに書き換える

単方向リストでは、要素が自分の次の場所だけを持っています。AとBのあいだにXを挟むには、Xの「次」をBに設定し、Aの「次」をBからXへ書き換えます。この2か所だけで済み、B以降には手を触れません。要素をずらすのは配列での挿入のやり方で、リストではその必要がありません。Xの「次」をAにすると向きが逆になり、つながりが壊れます。全要素を書き換える必要もありません。

間違えた用語の復習リストを見る →

この分野をまとめて解く → アルゴリズムとプログラミングのミニテスト(全44問)

最終更新:2026-11-05