基本情報技術者試験「連結リスト」の問題
単方向連結リストの各ノードはメンバ val(整数)と next(次ノードへの参照。なければ NULL)をもつ。先頭ノード head から順に val を合計する次の手続に、head→[112]→[88]→[115]→NULL のリストを与えて実行したとき、戻り値はどれか。
○整数型: total(ノード: head)
整数型: sum ← 0
ノード: cur ← head
while (cur が NULL でない)
sum ← sum + cur.val
cur ← cur.next
endwhile
return sumア35
イ3150
ウ315
エ203
正解
ウ.315
cur が NULL になるまで各ノードの val を sum に加える。112, 88, 115 をすべて加えて 112+88+115=315 となるため ウが正しい。
?選択肢ごとの解説
ア ×合計 315 の桁を取り違え、各 val の十の位だけを拾うなどして 35 とした桁の誤りである。
イ ×加算ではなく桁を連結・スケールしてしまい 3150 とした、加算結果を 10 倍に膨らませた誤りである。
ウ ○cur が NULL になるまで各ノードの val を sum に加える。112, 88, 115 をすべて加えて 112+88+115=315 となるため ウが正しい。
エ ×先頭ノード 112 を処理せず 88+115=203 を求め、初期 cur の位置を 1 つ進めすぎた off-by-one 的誤りである。
✎くわしく
連結リスト走査では『現ノードを処理してから next へ進む』順序が要である。加算と前進の順を入れ替えると先頭または末尾を取りこぼす。
✓本番での押さえどころ
試験のコツ
while 条件は『cur が NULL でない』を毎回確認し、処理→前進の 2 行をセットで追う。
覚え方
『見てから動く』=処理してから next、と覚える。
よくある誤り
cur←cur.next を加算より前に書き、先頭要素を飛ばすミスが多い。
アルゴリズムとプログラミングの他の問題
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0005