マナビング基本情報技術者

連結リストの途中挿入で参照先をどう更新するか

基本情報技術者試験 平成30年度春期 午前 問6 / アルゴリズムとプログラミング › データ構造

過去問にチャレンジ

平成30年度春期 午前 問6

リストを二つの1次元配列で実現する。配列要素 box[i] と next[i] の対がリストの一つの要素に対応し,box[i] に要素の値が入り,next[i] に次の要素の番号が入る。配列が図の状態の場合,リストの3番目と4番目との間に値が H である要素を挿入したときの next[8] の値はどれか。ここで,next[0] がリストの先頭(1番目)の要素を指し,next[i] の値が0である要素はリストの最後を示し,next[i] の値が空白である要素はリストに連結されていない。

平成30年度春期 午前 問6の図
  1. ア

    3

  2. イ

    5

  3. ウ

    7

  4. エ

    8

会話形式の解説

講師講師
まず、リストの順番をnextが指す先から確かめましょう。添字の順に並んでいるとは限りません。
受験者受験者
boxではHが添字8にありますが、その前後は表を見るだけでは決められませんね。
講師講師
はい。next[0]は1を指します。そこからたどると、添字は1→5→3→7→2で、値はA→E→C→G→Bです。
受験者受験者
3番目がC、4番目がGです。Hを入れると、C→H→Gになりますね。
講師講師
そのとおりです。Cの添字は3、Hの添字は8なので、CからHへ進むようnext[3]を8にします。では、next[8]はどこを指しますか。
受験者受験者
Hの次はGです。Gの添字は7なので、next[8]には7を入れます。
講師講師
正解です。3を入れるとHから直前のCへ戻ってしまいます。5は2番目のEの添字なので、Hの次には当たりません。
受験者受験者
8はH自身の添字ですから、next[8]を8にするとHから先へ進めませんね。
講師講師
はい。nextに入れるのは次の要素の値ではなく、その要素の添字です。挿入では直前の要素と、挿入する要素の参照先をそれぞれ確かめましょう。

まとめ

リストの並びはboxの添字順ではなく、next[0]からたどって確認します。挿入前の並びはA→E→C→G→Bで、Hを入れる位置はCとGの間です。Hの次は添字7のGなので、next[8]は7、正解はウです。

解答・解説

正解はウです

この問題のテーマ

配列で表した連結リストで、要素を途中に挿入するときの参照先を問う問題です。

解き方の考え方

next[0]から順にたどると、添字は1→5→3→7→2となり、要素はA→E→C→G→Bの順です。3番目のCと4番目のGの間に、添字8のHを入れます。CからHへつなぐためにnext[3]を8にし、HからGへつなぐためにnext[8]を7にします。

選択肢ごとの解説

  1. ×ア  3
    3はHの直前にあるCの添字です。HからCへ戻す値ではないため、next[8]には入りません。
  2. ×イ  5
    5は2番目のEの添字です。Hの次に来るのはGなので、next[8]は5ではありません。
  3. ○ウ  7
    7はGの添字です。挿入後、Hの次はGになるので、next[8]の値は7です。
  4. ×エ  8
    8はH自身の添字です。next[8]を8にするとHが自分自身を指し、次のGへ進めません。

POINT

  • リストの並びは、boxの添字順ではなく、nextが指す先をたどって確認します。
  • 途中への挿入では、直前の要素と挿入する要素の参照先を更新します。
  • nextに入れるのは要素の値ではなく、次の要素の添字です。

※出典:平成30年度春期 基本情報技術者試験 午前 問6(一部改変)