前回のデータ構造のハッシュテーブルを見るの記事でハッシュテーブルに触れたが、ハッシュテーブルの衝突の問題が残っている。
PHPではハッシュテーブルの回避の手段としてチェイン法を採用しているが、チェイン法を見るためにはデータ構造の連結リストを把握する必要があるので、今回は連結リストを見ることにする。
といっても、ここではPHPでシンプルな単方向連結リストのみ触れる事にする。
今回も細かい説明は後回しにして、単方向連結リストに必要な関数を挙げる。
※PHPにはC言語等でいうところの構造体がないので、代替としてクラスを利用する。
class Node {
public $x;
public $next;
}
//Nodeの末尾に値を加える
function _add(&$l, $x){
$node = new Node();
$node->x = $x;
//リストにNodeがない場合は先頭にNodeを付与する
if(is_null($l)){
$l = $node;
}else{
//Nodeのnextの値がない場合は新たなNodeのアドレスを渡す
if(is_null($l->next)){
$l->next = &$node;
}else{
//nextの値がないNodeまで再帰的に移動する
_add($l->next, $x);
}
}
return true;
}
上記の関数を早速使ってみる。
$list = null; _add($list, "サクラ"); _add($list, "エノキ"); _add($list, "カエデ"); _add($list, "ヒノキ");
上記のコードの値を図で可視化すると、

上の図のように各値を矢印で繋いだようになる。
PHPでは配列の要素数の指定がなかったり、連想配列があるので連結リストの恩恵は感じられないが、C言語等のメモリを直接触れるような言語であれば、連結リストは値の追加が無制限になるので重宝する。
この連結リストがハッシュテーブルの衝突を回避する上で重要だと冒頭で記載したので、前回のハッシュテーブルに連結リストを加味してコードを書き換えてみることにする。
追記
双方向連結リストの場合、
class Node {
public $x;
public $next;
public $prev;
}
のように次の他に前のノード(prev)のアドレスを持つプロパティを持つことで実現できる





