本文へ移動

基本情報技術者試験 · 学習ガイド

単方向リストを配列でたどる

単方向リストとは

単方向リストとは、各要素が次の要素への参照だけを持つ構造で、配列の添字とは別に参照をたどります。

dataとnextの表を示し、エルくんが3:Cから2:Bへの参照矢印をつなぐ図。
添字1からnextをたどると1→3→2→終了、データはA→C→Bの順です。格納順とたどる順の違いを表します。

配列の添字順と、データを読む順番は同じとは限りません。単方向リストは、現在の要素が持つ「次の要素への参照」を頼りに進む構造です。

基本の仕組み

基本の仕組みの図解。中央に添字1・2・3の配列を横並びに置き、それぞれA・B・Cを入れる。先頭の1から、nextの矢印を1→3→2→nullの順につなぎ、読む順A→C→Bが分かるようにする。
覚えること:読んでnextへ、nullなら停止

1始まりの例で、data[1]=A、data[2]=B、data[3]=C、next[1]=3、next[3]=2、next[2]=null、先頭が1なら、読む順はA→C→Bです。添字を1ずつ増やすのではなく、1→3→2とnextをたどります。

現在位置pのデータを読み、その後でp=next[p]へ更新します。pが終了を表す値になれば止めます。終了値が未定義(null)か0か、添字が0始まりか1始まりかは設問の定義に従い、終了値を配列の添字として参照しないようにします。

途中へ要素を挿入するときは参照の付け替えが必要です。ただし、走査の問題では挿入処理を勝手に追加しません。各反復の「更新前のp」「読んだdata[p]」「次のp」を表にすると、データ値と添字を混同しにくくなります。

配列によるリスト表現

配列によるリスト表現の図解。1枚の図に、直前要素を左上、新要素を下、旧後続を右上の配列枠として離して置く。直前要素から旧後続への元のnextは細い破線で示し、①新要素から旧後続へnextをつなぎ、②直前要素のnextを新要素へ付け替える順を番号付き矢印で示す。
覚えること:新nextを旧後続へ→直前nextを新へ

配列で単方向リストを表すときは、各要素の値だけでなく次要素の添字を保持します。先頭添字からnextをたどり、終端値で止めます。挿入では新要素のnextを旧後続へ設定してから、直前要素のnextを新要素へ変えます。

配列によるリスト表現
操作更新する参照
走査現在位置から次位置へ
途中挿入新要素と直前要素のnext
削除直前要素のnext

試験に出る

  • 配列の添字順ではなくnextをたどる読み順。
  • data[p]を読んでからp=next[p]へ更新する順序。
  • 終了値を配列の添字として参照しないこと。
  • 0始まりか1始まりかを設問の定義で確認すること。
  • データ値と添字、更新前と更新後のpを混同しないこと。

重要な言葉

単方向リスト
各要素が次の要素への参照だけを持つ構造。
添字
配列の要素を指定する番号。
終了値
走査の終わりを表す値。nullや0など設問の定義による。
走査
要素を順にたどって調べること。

確認問題

確かめようこの例でAを読んだ次にdata[2]を読む?

いいえ。next[1]=3なので、次はdata[3]のCです。

単方向リストは、配列の添字を1ずつ増やして読む。

終了を表す値を、配列の添字として参照してよい。

data[1]=A、next[1]=3のとき、Aの次に読むのは?

単方向リストの走査でpを更新する正しい順序は?

配列の添字順と、データを読む順番は同じとは限りません。は、現在の要素が持つ「次の要素への」を頼りに進む構造です。

1始まりの例で、data[1]=A、data[2]=B、data[3]=C、[1]=3、next[3]=2、next[2]=null、先頭が1なら、読む順はです。添字を1ずつ増やすのではなく、1→3→2とnextをたどります。

のデータを読み、その後でp=next[p]へ更新します。pが終了を表す値になれば止めます。終了値が未定義(null)か0か、添字が0始まりか1始まりかは設問の定義に従い、を配列の添字として参照しないようにします。

途中へ要素を挿入するときはが必要です。ただし、走査の問題では挿入処理を勝手に追加しません。各反復の「」「読んだdata[p]」「次のp」を表にすると、データ値と添字を混同しにくくなります。

出典・参考資料

試験の公式案内と、この記事の参考にした学習資料です。

編集:Pinternet Works · 更新日:

教材の編集方針・訂正について