単方向リストからの要素削除

■ 解き方の方針 単方向リストでは、削除対象そのものではなく、その一つ前の要素がもつnextを書き換えます。まずfor終了時にprevがどの位置を指すかを確認します。 ■ prevの位置 pos=2ならループは実行されず、prevは先頭、つまり1番目の要素です。posが3以上ならループ1回ごとにprevを次へ進めます。したがって、ループ終了時のprevは常に pos-1番目の要素 を指します。 ■ nextのつなぎ替え prev.next: 削除対象であるpos番目の要素 prev.next.next: 削除対象の次にあるpos+1番目の要素への参照 prevのnextを削除対象の次へ直接つなげれば、削除対象を飛び越せます。よって代入は prev.next ← prev.next.next です。 ■ 先頭削除との違い pos=1では一つ前の要素が存在しないため、別処理でlistHead自身をlistHead.nextへ更新しています。空欄はpos≥2の場合だけを扱います。 ■ 正解と誤答の見分け方 したがって、正解は カ です。 prev.nextやprevを代入すると参照先が変わらず、削除対象を飛び越せません。

次のプログラム中の  に入れる正しい答えを,解答群の中から選べ。

手続 delNode は,単方向リストから,引数 pos で指定された位置の要素を削除する手続である。引数 pos は,リストの要素数以下の正の整数とする。リストの先頭の位置を1とする。

 クラス ListElement は,単方向リストの要素を表す。クラス ListElement のメンバ変数の説明を表に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead には,リストの先頭要素の参照があらかじめ格納されている。

表 クラスListElementのメンバ変数の説明

メンバ変数

型

説明

val

文字型

要素の値

next

ListElement

次の要素の参照 次の要素がないときの状態は未定義

[プログラム]
 大域: ListElement: listHead // リストの先頭要素が格納されている
 〇delNode(整数型: pos)
  ListElement: prev
  if (posが1と等しい)
   listHead ← listHead.next
  else
   prev ← listHead
    /* posが2と等しいときは繰返し処理を実行しない */
   for (iを2から pos - 1まで1ずつ増やす)
    prev ← prev.next
   endfor
   prev.next ← (空欄)
  endif

出典令和4年度 基本情報技術者試験 科目B サンプル問題 問10
ア

listHead

イ

listHead.next

ウ

listHead.next.next

エ
prev
オ
prev.next
カ
prev.next.next