応用情報技術者 2019年 秋期 午前2 問06
問題文
先頭ポインタと末尾ポインタをもち、多くのデータがポインタでつながった単方向の線形リストの処理のうち、先頭ポインタ、末尾ポインタ又は各データのポインタをたどる回数が最も多いものはどれか。ここで、単方向のリストは先頭ポインタからつながっているものとし、追加するデータはポインタをたどらなくても参照できるものとする。
選択肢
ア:先頭にデータを追加する処理
イ:先頭のデータを削除する処理
ウ:末尾にデータを追加する処理
エ:末尾のデータを削除する処理(正解)
先頭ポインタと末尾ポインタをもち、多くのデータがポインタでつながった単方向の線形リストの処理のうち、先頭ポインタ、末尾ポインタ又は各データのポインタをたどる回数が最も多いものはどれか。【午前2 解説】
要点まとめ
- 結論:末尾のデータを削除する処理(エ)が最も多くポインタをたどる必要があります。
- 根拠:単方向リストは前方向のみのリンクで、末尾の削除は先頭から末尾直前まで探索が必要です。
- 差がつくポイント:追加や先頭削除はポインタ操作が少なく済みますが、末尾削除は線形探索が必須で時間がかかります。
正解の理由
単方向リストでは、先頭ポインタと末尾ポインタを持っていても、各ノードは次のノードへのポインタしか持ちません。
- 先頭にデータを追加(ア)は先頭ポインタの更新だけで済みます。
- 先頭のデータを削除(イ)も先頭ポインタを次のノードに変えるだけで済みます。
- 末尾にデータを追加(ウ)は末尾ポインタが直接参照できるため、ポインタをたどる必要はありません。
- 末尾のデータを削除(エ)は、末尾の一つ前のノードを探すために先頭から順に全ノードをたどる必要があり、最も多くポインタをたどります。
したがって、正解はエです。
よくある誤解
末尾ポインタがあるため末尾の削除もすぐできると誤解しがちですが、単方向リストでは前のノードを直接参照できません。
追加と削除の操作でポインタをたどる回数が異なることを理解しましょう。
追加と削除の操作でポインタをたどる回数が異なることを理解しましょう。
解法ステップ
- 単方向リストの構造を確認し、各ノードは次のノードへのポインタのみ持つことを理解する。
- 先頭ポインタと末尾ポインタの役割を整理する。
- 各操作(追加・削除)で必要なポインタのたどり方を考える。
- 先頭追加・先頭削除はポインタの更新のみで済むことを確認。
- 末尾追加は末尾ポインタで直接アクセス可能なためポインタたどりは不要。
- 末尾削除は末尾の一つ前のノードを探すため、先頭から順に全ノードをたどる必要があることを理解。
- 最も多くポインタをたどるのは末尾削除であると結論づける。
選択肢別の誤答解説
- ア: 先頭にデータを追加する処理
→ 先頭ポインタの更新だけで済み、ポインタをたどる回数は少ない。 - イ: 先頭のデータを削除する処理
→ 先頭ポインタを次のノードに変えるだけで済む。 - ウ: 末尾にデータを追加する処理
→ 末尾ポインタがあるため、直接末尾に追加できる。 - エ: 末尾のデータを削除する処理
→ 末尾の一つ前のノードを探すため、先頭から順に全ノードをたどる必要がある。
補足コラム
単方向リストは各ノードが次のノードへのポインタのみを持つため、前のノードを直接参照できません。
これに対し、双方向リストは前後両方向のポインタを持つため、末尾の削除も効率的に行えます。
データ構造の特性を理解し、操作のコストを見極めることが重要です。
これに対し、双方向リストは前後両方向のポインタを持つため、末尾の削除も効率的に行えます。
データ構造の特性を理解し、操作のコストを見極めることが重要です。
FAQ
Q: 末尾ポインタがあるのに、なぜ末尾削除で全ノードをたどるのですか?
A: 末尾ポインタは末尾ノードを指しますが、単方向リストは前のノードを参照できないため、末尾の一つ前のノードを探すには先頭から順にたどる必要があります。
A: 末尾ポインタは末尾ノードを指しますが、単方向リストは前のノードを参照できないため、末尾の一つ前のノードを探すには先頭から順にたどる必要があります。
Q: 先頭にデータを追加する処理はなぜポインタをあまりたどらないのですか?
A: 先頭に追加する場合、新しいノードの次ポインタに現在の先頭ノードを設定し、先頭ポインタを新ノードに更新するだけで済むためです。
A: 先頭に追加する場合、新しいノードの次ポインタに現在の先頭ノードを設定し、先頭ポインタを新ノードに更新するだけで済むためです。
関連キーワード: 単方向リスト、ポインタ操作、末尾削除、データ構造、線形リスト、ポインタたどり、リスト操作効率

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

