連結串列
連結串列(Linked list)是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在每一個節點裡存到下一個節點的指標(Pointer)。
使用連結串列結構可以克服陣列連結串列需要預先知道資料大小的缺點,連結串列結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是連結串列失去了陣列隨機讀取的優點,同時連結串列由於增加了結點的指標域,空間開銷比較大。
連結串列有很多種不同的型別:單向連結串列,雙向連結串列以及迴圈連結串列。
單向連結串列
連結串列中最簡單的一種是單向連結串列,它包含兩個域,一個資訊域和一個指標域。這個連結指向列表中的下一個節點,而最後一個節點則指向一個空值。
PHP實現簡單的單向連結串列
<?php
class Node
{
private $Data;//節點資料
private $Next;//儲存下個點物件
public function __construct($data, $next)
{
$this->Data = $data;
$this->Next = $next;
}
public function __set($name, $value)
{
if (isset($this->$name))
$this->$name = $value;
}
public function __get($name)
{
if (isset($this->$name))
return $this->$name;
else
return NULL;
}
}
class LinkList
{
private $head;//頭節點
private $len;
/**
* 初始化頭節點
*/
public function __construct()
{
$this->init();
}
public function setHead(Node $val)
{
$this->head = $val;
}
public function getHead()
{
return $this->head;
}
public function getLen()
{
return $this->len;
}
public function init()
{
$this->setHead(new Node(NULL, NULL));
$this->len = 0;
}
/**
* 設定某位置節點的資料
* @param int $index
* @param $data
* @return bool
*/
public function set(int $index, $data)
{
$i = 1;
$node = $this->getHead();
while ($node->Next !== NULL && $i <= $index) {
$node = $node->Next;
$i++;
}
$node->Data = $data;
return TRUE;
}
/**
* 獲取某位置節點的資料
* @param int $index
* @return mixed
*/
public function get(int $index)
{
$i = 1;
$node = $this->getHead();
while ($node->Next !== NULL && $i <= $index) {
$node = $node->Next;
$i++;
}
return $node->Data;
}
/**
* 在某位置處插入節點
* @param $data
* @param int $index
* @return bool
*/
public function insert($data, int $index = 0)
{
if ($index <= 0 || $index > $this->getLen())
return FALSE;
$i = 1;
$node = $this->getHead();
while ($node->Next !== NULL) {
if ($index === $i) break;
$node = $node->Next;
$i++;
}
$node->Next = new Node($data, $node->Next);
$this->len++;
return TRUE;
}
/**
* 刪除某位置的節點
* @param int $index
* @return bool
*/
public function delete(int $index)
{
if ($index <= 0 || $index > $this->getLen())
return FALSE;
$i = 1;
$node = $this->getHead();
while ($node->Next !== NULL) {
if ($index === $i) break;
$node = $node->Next;
$i++;
}
$node->Next = $node->Next->Next;
$this->len--;
return TRUE;
}
}
複製程式碼
雙向連結串列 一種更復雜的連結串列是“雙向連結串列”或“雙面連結串列”。每個節點有兩個連線:一個指向前一個節點,(當此“連線”為第一個“連線”時,指向空值或者空列表);而另一個指向下一個節點,(當此“連線”為最後一個“連線”時,指向空值或者空列表)
迴圈連結串列 在一個 迴圈連結串列中,首節點和末節點被連線在一起。這種方式在單向和雙向連結串列中皆可實現。要轉換一個迴圈連結串列,你開始於任意一個節點然後沿著列表的任一方向直到返回開始的節點。再來看另一種方法,迴圈連結串列可以被視為“無頭無尾”。這種列表很利於節約資料儲存快取,假定你在一個列表中有一個物件並且希望所有其他物件迭代在一個非特殊的排列下。 指向整個列表的指標可以被稱作訪問指標。
基本思路都差不多有時間繼續更新