単方向リストは、要素の1つ1つが「値」と「次の要素の場所」を持つ並びです。配列を前から順に読むのとはちがい、読む順は置いてある順ではありません。先頭の要素から「次の要素の場所」を順にたどって読みます。
期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円第2部 定番処理の型 全26回A10-1リストを読む一覧を開く
A1-1トレース表の書き方A1-2繰返しのトレースA1-3配列のトレースA2-1配列を全部見るA2-2最大・最小を見つけるA2-3探す(線形探索)A2-4入れる・消すA3-12次元配列の走査A3-22次元配列の集計A4-1文字列を1文字ずつA4-2文字列照合A5-1交換して並べるA5-2挿入ソートA6分割して並べるA7-12分探索A7-2ハッシュ表探索A8-1再帰とはA8-2再帰のトレースA9スタックとキューA10-1リストを読むA10-2リストの挿入と削除A11木構造A12木の巡回A13グラフA14AI・データを題材にしたプログラムA15コントロールブレーク処理
この回の内容を動画で見る
次のページで講義の目次と無料の講義を見られます。受講ボタンとクーポンコードもそこにあります。
この回の内容を動画で見る
解くための再現性が身につく講義29本小テスト86問模試3回分IT資格の森で見る
講義「リストをたどる」(全7分06秒)は、IT資格の森(月額1,280円)の会員向けです。科目Bは、1行ずつ値を追うアニメの講義と、講義ごとの小テスト、本番と同じ形の模擬試験がそろっています。
単方向リスト ── 値と「次の場所」の組
科目Bでは、単方向リストを2本の配列で表すことがあります。1本に値を入れ、もう1本に、次の要素の場所として要素番号を入れます。
文字型の配列: val ← {"A", "C", "D", "B"}
整数型の配列: next ← {4, 3, 未定義の値, 2}
同じ番号の2枡で、1つの要素
上の段=値 / 下の段=次の要素の番号 / 枡の上の数字=要素番号 / 網掛け=未定義
val
1A
2C
3D
4B
next
14
23
3未定義
42
1番の要素は、値が A、次の要素が 4番。3番の要素は、値が D、次の要素は無い(未定義)。
next に入っているのは値ではなく、次に読む要素の番号です。値が A・C・D・B とばらばらの順で入っていても、next のとおりに読めば順番は決まります。ばらばらに置けるおかげで、あとから要素を足したり抜いたりするときに、ほかの要素を動かさずに済みます(足し方と抜き方は A10-2)。
たどり方 ── next の番号へ移り、未定義で止まる
読み始めるのは先頭の要素です。どの要素が先頭かは、問題ごとに決めてあります。この例では、1番の要素を先頭とします(令和8年度 問4 も、問題文で1番を先頭と決めています)。
1番の要素で、何をするか ── 値を読むのと、次を知るのは別の枡
琥珀=いま読んでいる枡 / 灰=もう読んだ枡 / 矢印=次にどこへ行くか / 破線=次に読む枡 / 網掛け=未定義
① 値は、同じ番号の val にある
val
1A
2C
3D
4B
next
14
23
3未定義
42
いま 1番の要素にいます。読む値は val[1] の A。
② 次にどこへ行くかは、同じ番号の next に書いてある
val
1A
2C
3D
4B
4 番へ
next
14
23
3未定義
42
next[1] の中身は 4。次に読むのは 4番の要素です。2番と3番を飛び越えて、先に4番へ行きます。
4番の要素に着いたら、そこでも同じ2つをします。next が未定義の要素に着くまで続けると、こうなります。
先頭から最後までたどると、A → B → C → D の順に読める
左の丸数字=読む順 / 網掛け=未定義
①
1番の要素
val[1] 値A
next[1] 次の要素の番号4
next[1] が 4 なので、次は 4番
②
4番の要素
val[4] 値B
next[4] 次の要素の番号2
next[4] が 2 なので、次は 2番
③
2番の要素
val[2] 値C
next[2] 次の要素の番号3
next[2] が 3 なので、次は 3番
④
3番の要素
val[3] 値D
next[3] 次の要素の番号未定義
next[3] が未定義。次の要素が無いので、ここで終わり
たどった番号は 1 → 4 → 2 → 3。読んだ値は A → B → C → D。
4つ目に読んだ3番の要素は、next が未定義です。次の要素が無いので、ここが末尾です。末尾は、配列のいちばんうしろにあるとは限りません。next が未定義の要素が末尾です。
(令和8年度 基本情報技術者試験 科目B 公開問題 問4)
「単方向リストの末尾に対応するpointerList の要素は未定義である。」
この問題では、次の要素の番号を入れる配列の名前が pointerList です。名前はちがっても、役目は next と同じです。
たどるプログラム ── p ← next[p] をくり返す
いま手でたどったことを、プログラムにします。p は、いまいる要素の番号を入れておく変数です。
文字型の配列: val ← {"A", "C", "D", "B"}
整数型の配列: next ← {4, 3, 未定義の値, 2}
整数型: p ← 1
while (true)
val[p] を出力する
if (next[p] が 未定義)
繰返し処理を終了する
endif
p ← next[p]
endwhile
当サイトで作った例です。
実行すると、A、B、C、D の順に出力されます。
上から読む
-
整数型: p ← 1
先頭から始める。先頭は1番の要素なので、pに 1 を入れます。 -
while (true)
抜けるまでくり返す。要素がいくつ続くかは、たどってみるまで分かりません。回数を決めずにくり返し、末尾に着いたら中から抜けます。 -
val[p] を出力する
値を読む。いまいる要素の値です。pが 1 ならval[1]の A。 -
if (next[p] が 未定義) 繰返し処理を終了する endif末尾かどうかを見る。見るのはnext[p]です。未定義なら次の要素が無いので、くり返しを抜けます。ここで抜けないと、次の行でpが未定義になり、次の周で読む要素が決まりません。 -
p ← next[p]
次の要素へ進む。pが 1 なら、next[1]の 4 がpに入ります。次の周は4番の要素を読みます。
リストをたどるプログラムを、1行ずつ動かす
当サイトオリジナルの例題
ループ開始前
2本の配列(上が値、下が次の要素の番号)
いま計算していること
変数の状態
出力(左から、出た順)
p ← next[p] は、いまいる要素の next を読んで、その番号を新しい p にする行です。リストをたどるプログラムでは、この行が「次の要素へ進む行」にあたります。
クラスで書かれたリスト ── next[p] が p.next になる
同じリストが、クラスを使って書かれることもあります。要素1つをクラス ListElement で表し、メンバ変数に val(値)と next(次の要素)を持たせる書き方です。
こちらには番号が出てきません。next に入っているのは、次の要素そのものを指す参照です(参照=どの要素かを指すもの)。p も番号ではなく、要素を指す変数になります。
クラスで表すと、要素どうしが参照でつながる
箱=要素(中の字は val の値) / 矢印=その要素の next が指している要素 / かっこの中=その要素を指している変数
A
(listHead)
next
B
next
C
next
D
listHead が指しているのは、値が A の要素。D の next は未定義なので、D から先へ出る矢印はありません。
listHead は、先頭の要素を指している変数です。たどるときは、ここから始めます。配列2本のときと並べると、こうなります。
| すること | 配列2本 | クラス |
|---|---|---|
| 始める | p ← 1 |
p ← listHead |
| 値を読む | val[p] |
p.val |
| 末尾か見る | next[p] が 未定義 |
p.next が 未定義 |
| 次へ進む | p ← next[p] |
p ← p.next |
プログラムにすると、こうなります。listHead には、上の図のリストの先頭(A の要素)がすでに入っているものとします。
大域: ListElement: listHead
ListElement: p
p ← listHead
while (true)
p.val を出力する
if (p.next が 未定義)
繰返し処理を終了する
endif
p ← p.next
endwhile
当サイトで作った例です。
1行目の 大域: は、どの手続からも使える変数に付く印です。ListElement: p で、要素を指す変数 p を用意しています。
上の図のリストで動かすと、p ははじめ A の要素を指します。このとき p.next は B の要素なので、p ← p.next のあと p は B の要素を指します。これを D の要素までくり返すので、出力は配列2本のときと同じ A、B、C、D です。
(基本情報技術者試験 科目B サンプル問題 問10)
prev ← prev.next
変数の名前は prev ですが、形は p ← p.next と同じです。prev が指す先を、次の要素へ進めています。この問題では、メンバ変数を説明する表に、next について「次の要素がないときの状態は未定義」と書かれています。
書き方が変わっても、読むところは同じです ── どこから始めるか、どの行で次へ進むか、何が未定義なら止まるか。
次に読む
| A10-2 | リストの挿入と削除 ─ next をつなぎ替える |
| 令和8年度 問4 | 配列2本で表した単方向リストをたどる問題の解説 |
| サンプル問題 問10 | クラスで表した単方向リストから要素を削除する問題の解説 |
| G12 | オブジェクト ─ 変数.メンバ変数 の読み方 |
| 目次 | 基本情報技術者試験 科目B 攻略ガイド |
この記事で引用した資料
- 基本情報技術者試験 シラバス Ver9.2(2026年1月8日)
- 基本情報技術者試験 科目B サンプル問題(2022年12月26日公開)
- 令和8年度 基本情報技術者試験 科目B 公開問題(2026年7月1日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。
本文の例題は当サイトのオリジナルです。


