思いのほか不安定なブログ

テキトーなことを書いていきます.

学習記録2/15

  1. アルゴリズムとデータ構造
  2. C++

1は主に連結リストについて。連結リストにはいくつか種類があって、単なる連結リスト、循環リスト、双方向リストなどが存在し、循環リストと双方向リストは組み合わされることも多いらしい。各種連結リストの挿入、削除のところで一つ疑問があった。

例えば一番シンプルな連結リストを考える。各セルが値(value)と次のセルを指すポインタ(next)のみを持っている。この連結リストに新しいセルを挿入しようとするとき、連結リストの先頭に挿入する場合と途中に挿入する場合とで、場合分けして処理をしなければないらしい。この時、headというポインタが連結リストの先頭をさしているという条件だったのだが、headを単にセルとして定義すると場合分けしなくてよいのだという。この理屈がしばらく理解できなかった。

xというセルの後にpという新しいセルを挿入したいとき、

p->next = x->next;

x->next = p;

とするのはわかる。が、場合分けしなければならない理由がわからなかった。読んでいた本ではheadをセルとして定義すれば、x=&headとすれば場合分けせずに同じ処理で済むと言っているのだが、そんなのheadがポインタでもx=headとすれば同じじゃん、と思ってなんでわざわざheadをセルとして定義するのかわからなかった。

しかし今思うと、普通に考えてheadがポインタの場合、headは値もnextというポインタも持っていないので、x=headとすれば当然上記の処理は成り立たない。なんでこんな簡単なことに気づかずめちゃくちゃ悩んでいたのだろうか。。。自戒も込めてここに記しておく。

 

2はnewとdelete、参照についてやった。参照はやっていて基礎知識があいまいだと感じたので一度復習をしたい。がその他ではとくに躓くところもなかった。