単方向リストの読み方|next をたどって、未定義で止まる【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-10-11

単方向リストは、要素の1つ1つが「値」と「次の要素の場所」を持つ並びです。配列を前から順に読むのとはちがい、読む順は置いてある順ではありません。先頭の要素から「次の要素の場所」を順にたどって読みます。

期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円2,600円中身を見る ›

単方向リスト ── 値と「次の場所」の組

科目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 の順に出力されます。

上から読む

  1. 整数型: p ← 1
    先頭から始める。先頭は1番の要素なので、p に 1 を入れます。
  2. while (true)
    抜けるまでくり返す。要素がいくつ続くかは、たどってみるまで分かりません。回数を決めずにくり返し、末尾に着いたら中から抜けます。
  3.   val[p] を出力する
    値を読む。いまいる要素の値です。p が 1 なら val[1] の A。
  4.   if (next[p] が 未定義)
        繰返し処理を終了する
      endif
    末尾かどうかを見る。見るのは next[p] です。未定義なら次の要素が無いので、くり返しを抜けます。ここで抜けないと、次の行で p が未定義になり、次の周で読む要素が決まりません。
  5.   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 攻略ガイド

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。

本文の例題は当サイトのオリジナルです。

タイトルとURLをコピーしました