双方向リストを三つの一次元配列elem[i],next[i],prev[i]の組で実現する。
双方向リストが図の状態のとき,要素Dの次に要素Cを挿入した後のnext[6],prev[6]の値の組合せはどれか。
ここで,双方向リストは次のように表現する。
・双方向リストの要素は,elem[i]に値,next[i]に次の要素の要素番号,prev[i]に前の要素の要素番号を設定
・双方向リストの先頭,末尾の要素番号は,それぞれ変数Head,Tailに設定
・next[i],prev[i]の値が0である要素は,それぞれ双方向リストの末尾,先頭を表す。
・双方向リストへの要素の追加は,一次元配列の末尾に追加
正答3
解説
正解は3です。
配列で実現した双方向リストに要素を挿入したとき、新しい要素のnextとprevに何が入るかを問う問題です。
図では、要素番号1〜5のelemがA、F、D、B、E、nextが4、0、5、3、2、prevが0、5、4、1、3で、Headは1、Tailは2です。
【計算】
Headが1なので、先頭は要素番号1のAです。
next[1]=4なので、Aの次は要素番号4のBです。
next[4]=3なので、Bの次は要素番号3のDです。
next[3]=5なので、Dの次は要素番号5のEです。
next[5]=2なので、Eの次は要素番号2のFで、next[2]=0なのでFが末尾です。
リストの並びはA、B、D、E、Fです。
要素Cは配列の末尾の要素番号6に追加します。
CをDとEの間に入れるので、Cの次はE(要素番号5)、Cの前はD(要素番号3)です。
よってnext[6]=5、prev[6]=3です。
あわせてnext[3]を6に、prev[5]を6に書き換えます。
【選択肢別解説】
1:× next[6]=2はCの次をF(要素番号2)とする値です。
Cの次はEなので、正しくはnext[6]=5です。
2:× next[6]=3、prev[6]=4は、BとDの間、つまりDの前にCを入れた場合の値です。
本問はDの次に挿入するので、正しくはnext[6]=5、prev[6]=3です。
3:○ Cの次はE(要素番号5)、前はD(要素番号3)なので、next[6]=5、prev[6]=3になります。
4:× prev[6]=4はCの前をB(要素番号4)とする値です。
Cの前はDなので、正しくはprev[6]=3です。
【ポイント】
配列で表したリストは、要素番号の順ではなく、Headからnextをたどった順が論理的な並びです。
双方向リストへの挿入では、新要素のnextとprevに加えて、前の要素のnextと次の要素のprevの計4か所を書き換えます。