アルゴリズムとプログラミング

基本情報技術者試験連結リスト」の問題

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:normal
単方向連結リストの各ノードは val と next(参照、末尾は NULL)をもつ。次の擬似言語は、リスト a の末尾にリスト b をつなげ、連結後の先頭を返す手続である。a=headA→[110]→[220]→[330]→NULL、b=headB→[440]→[550]→NULL を与えて実行したとき、返された先頭から末尾までの val の並びはどれか。
○ノード: concat(ノード: a, ノード: b)
  if (a が NULL)
    return b
  endif
  ノード: cur ← a
  while (cur.next が NULL でない)
    cur ← cur.next
  endwhile
  cur.next ← b
  return a
{110, 220, 330, 440, 550}
{110, 440, 220, 550, 330, 110}
{440, 550, 110}
{110, 220, 330}
正解
{110, 220, 330, 440, 550}

while で a の末尾(next が NULL のノード 330)まで進み、その next に b の先頭 440 を接続する。先頭 a を返すので並びは {110, 220, 330, 440, 550} となり ウが正しい。

?選択肢ごとの解説

ウ ○while で a の末尾(next が NULL のノード 330)まで進み、その next に b の先頭 440 を接続する。先頭 a を返すので並びは {110, 220, 330, 440, 550} となり ウが正しい。
ア ×2 つのリストを交互に併合したうえ先頭 110 を重複させて {110, 440, 220, 550, 330, 110} とした、連結をマージと取り違えた誤りである。
イ ×b を a の前に置いたうえ末尾を取りこぼして {440, 550, 110} とした、接続の向きを逆にし要素も落とした誤りである。
エ ×b を接続せず a の元の並び {110, 220, 330} のままとした、末尾への接続を行わなかった誤りである。

くわしく

リスト連結は『a の末尾を探し、その next に b の先頭を付ける』だけで、b 側は再構築しない。末尾探索の while 条件 cur.next≠NULL を正しく置くことが核心である。

本番での押さえどころ

試験のコツ

末尾ノードは『next が NULL のノード』と定義し、そこへ b の先頭をつなぐと整理する。

覚え方

『a の最後の矢印を b の先頭へ伸ばす』と覚える。

よくある誤り

while 条件を cur≠NULL とすると末尾を通り越して NULL を参照し、接続に失敗するミスが多い。

アルゴリズムとプログラミングの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0111

【基本情報技術者試験】連結リストの問題 — 解答・解説|ukamiru 過去問