基本情報技術者試験「連結リスト」の問題
単方向連結リストの各ノードは val と next(参照、末尾は NULL)をもつ。次の擬似言語は、low を 1 歩・high を 2 歩ずつ進める二走査ポインタ法で中間ノードを求め、その val を返す手続である。head→[100]→[200]→[300]→[400]→[500]→[600]→[700]→NULL(7 ノード)を与えて実行したとき、戻り値はどれか。
○整数型: middle(ノード: head)
ノード: low ← head
ノード: high ← head
while (high.next が NULL でない かつ high.next.next が NULL でない)
low ← low.next
high ← high.next.next
endwhile
return low.valエ400
ア30
イ500
ウ700の手前
正解
エ.400
high が low の倍速で進むため、high が末尾に達したとき low は全体の中央に位置する。7 ノードでは 4 番目で停止し val=400 となるため エが正しい。
?選択肢ごとの解説
エ ○high が low の倍速で進むため、high が末尾に達したとき low は全体の中央に位置する。7 ノードでは 4 番目で停止し val=400 となるため エが正しい。
ア ×3 番目ノード 300 の桁を取り違えて 30 とした、反復回数の数え誤りと桁の誤りである。
イ ×high の位置(5 番目付近)を中央と取り違えて 500 とした、low と high を混同した誤りである。
ウ ×末尾近くで停止すると曖昧に捉えて『700の手前』とした、停止位置を正確に特定できていない誤りである。
✎くわしく
二走査ポインタ法では速いポインタが端に着くと遅いポインタが中央に来る。停止条件 high.next と high.next.next の両方を確認することで、奇数長で中央ちょうど・偶数長で後半側に止まる挙動が決まる。
✓本番での押さえどころ
試験のコツ
low と high の到達ノードを 1 行ずつ並記し、ループ終了時の low を読む。
覚え方
『高速が端に着くと低速が真ん中』と覚える。
よくある誤り
返す変数を low ではなく high にして末尾値を答えるミスや、停止条件の取り違えが多い。
アルゴリズムとプログラミングの他の問題
次の擬似言語で表される手続 sumOdd を、引数として要素数 5 の整数型の配列 {12, 125, 1008,…次の擬似言語は、整数型の配列 arr に対して隣接交換を行う手続の一部であり、外側ループの 1 回目(1…次の擬似言語は昇順に整列された配列 arr に対する二分探索の手続である。arr = {2, 4, 6, 8, 10,…次の擬似言語で表される再帰手続 f を、引数 n = 20 で呼び出したとき、戻り値として返される値はどれか。
```…単方向連結リストの各ノードはメンバ val(整数)と next(次ノードへの参照。なければ NULL)をもつ。先頭ノード…スタックに対する push(積む)と…
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0112