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

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

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:hard
単方向連結リストの各ノードは 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 にして末尾値を答えるミスや、停止条件の取り違えが多い。

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

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

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

無料ではじめる →

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

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