マツケンのマインド

とある理系大学生のブログです。基本は勉強とつぶやきとまとめです。

アルゴリズムとデータ構造~リスト(list)~

f:id:matsuken_jory:20210522222232p:plain

リストとは

 配列が苦手な挿入と削除を効率よく行えるデータ構造。参照が苦手。データが入った箱をポインタでつないだもの。図のように箱の中に要素を入れる場所と、次の箱の場所を示すポインタのセット。一番最後の場所は次の箱へのポインタがないのでNULLを入れる。番地をデータとして扱っているので、ランダムアクセスが不可能。データの個数が更新できるので、柔軟にプログラム設計可能。

様子

 以下の図のようにイメージしていただければ大丈夫です。
f:id:matsuken_jory:20210522222235p:plain
変数としてよく使うのがlistheadです。これはリストの先頭を指し示すポインタです。この先頭からポインタをたどることにより、参照したいデータにたどり着かなければならないので、リストの数をnとすれば、計算量はO(n)になります。しかし、挿入と削除はかなり簡単です。
f:id:matsuken_jory:20210522222240p:plain
挿入はこんな感じですが、先頭に挿入する際には少し工夫が必要です。計算量はO(1)。

削除もO(1)です。消したいものをつながないようにするだけです。
f:id:matsuken_jory:20210522222227p:plain
こんな感じです。削除したい箱を飛び越えるように繋ぎ変えればよいのです。こうして飛ばされたデータはのちに開放する必要があります。