04 リスト(list)

【知識】

データをポインタ(次のデータの位置)でつないだ構造。各要素は「セル」と呼ばれ、 データ部+ポインタ部からなる。

単方向(片方向)リスト
head A B C D E NULL
各セル=データ部ポインタ部(●=次のセルを指す)。末尾のポインタは NULL。
双方向(両方向)リスト … 前後どちらへもたどれる
head A B C D E tail
各セルが前後2つのポインタをもつ。環状リストでは末尾のポインタが先頭を指す。

配列との違い(超重要)

操作配列リスト
参照(ランダムアクセス)速い(添字で一発)遅い(先頭からたどる)
挿入・削除遅い(要素をずらす)速い(ポインタ数個の付け替え)
ひとことで:配列は「読むのが得意」、リストは「入れ替えが得意」。

【演習】理解度チェック

Q1(H21春 問6)★配列 vs 連結リスト・頻出

配列と比較した場合の連結リストの特徴として、適切なものはどれか。

解説を表示

正解:エ

過去問道場で確認

Q2(H24春 問7)★単方向リストのポインタ参照回数

先頭ポインタと末尾ポインタをもつ単方向リストで、ポインタを参照する回数が最も多い操作はどれか。

解説を表示

正解:エ

ポイントは「単方向リストは逆向きにたどれない」こと。

▼速解法:「単方向リストで末尾側をいじる/1つ前が必要な操作」は、先頭から全部たどるので一番重い。

過去問道場で確認

Q3 ★挿入で書き換えるポインタの数

あるノードの直後に新しいノードを1個挿入する。書き換える(付け替える)ポインタの数は、単方向リスト双方向リストでそれぞれいくつか。

解説を表示

正解:ウ(単方向 2本/双方向 4本)

単方向リスト:2本

  1. 新ノードの next ← 後続ノード
  2. 前ノードの next ← 新ノード

双方向リスト:4本

  1. 新ノードの next ← 後続ノード
  2. 新ノードの prev ← 前ノード
  3. 前ノードの next ← 新ノード
  4. 後続ノードの prev ← 新ノード

ポイント:要素の移動は一切不要(配列なら後ろを全部ずらす)。だからリストは挿入・削除が速い。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」

Q4 ★構造の使い分け

次の2つの用途に向くデータ構造の組み合わせとして適切なものはどれか。
① 先頭・途中への挿入や削除が頻繁に起こる
② 「n 番目の要素」を何度もランダムに読み出す

解説を表示

正解:イ

「入れ替えが多い=リスト、読み出しが多い=配列」で判断する。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」

Q5 ★ノード挿入のポインタ付け替え

次の単方向リストで、ノード B と C の間に新しいノード X を挿入したい。付け替える(設定する)ポインタの組合せとして正しいものはどれか。

head A B C DNULL
挿入するノード X を、B と C の間に入れる。
解説を表示

正解:ア

単方向リストの挿入はポインタ2本の付け替えだけ(要素の移動は不要)。順番も大事:

  1. まず X の next ← C(C への道を X に持たせる)
  2. 次に B の next ← X(B の行き先を X に変える)

順番のワナ:先に「B の next ← X」をすると、元の C の位置(B の next)が上書きされて C 以降を見失う。だから X の next ← C を先に
ウは A を、エは D を書き換えていて挿入位置が違う。イは向きが逆。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」


【練習リンク】