鏈表由一個一個的做爲節點的對象構成的,每個節點都有指向下一個節點的指針,最後一個節點的指針域指向空。每一個節點能夠存儲任何數據類型。git
對單鏈表咱們常見的操做有以下:github
首先咱們根據定義實現一個ListNode類。web
class ListNode { private $data; private $next; public function __construct(string $data) { $this->data = $data; } public function __get($var) { return $this->$var; } public function __set($var, $val) { return $this->$var = $val; } }
再來看鏈表類,首先須要2個私有屬性,分別是頭節點和長度。算法
class LinkedList { private $head; private $length; }
下面咱們長話短說,直接看如何實現第一個即經常使用的插入,這是是一個平均時間複雜度爲O(n)的操做。數據結構
/** * 插入一個節點 * @param string|null $data * @return bool * complexity O(n) */ public function insert(string $data = null) { $newNode = new ListNode($data); if ($this->head === null) { $this->head = &$newNode; } else { $currentNode = $this->head; while ($currentNode->next !== null) { $currentNode = $currentNode->next; } $currentNode->next = $newNode; } $this->length++; return true; }
再來看搜索,一樣是一個平均時間複雜度爲O(n)的操做。數據結構和算法
/** * 搜索一個節點 * @param string $data * @return bool|ListNode * complexity O(n) */ public function search(string $data) { if ($this->length > 0) { $currentNode = $this->head; while ($currentNode !== null) { if ($currentNode->data === $data) { return $currentNode; } $currentNode = $currentNode->next; } } return false; }
反轉單鏈表優化
public function reverse() { if ($this->head !== null) { if ($this->head->next !== null) { $reveredList = null; $next = null; $currentNode = $this->head; while ($currentNode !== null) { $next = $currentNode->next; $currentNode->next = $reveredList; $reveredList = $currentNode; $currentNode = $next; } $this->head = $reveredList; } } }
單鏈表其餘操做的詳細實現能夠參考 這裏。this
單鏈表是鏈表這種鏈式存取數據結構中基礎的部分,一樣屬於鏈表結構的還有雙鏈表,環形鏈表和多鏈表。指針
PHP基礎數據結構專題系列目錄地址:https://github.com/... 主要使用PHP語法總結基礎的數據結構和算法。還有咱們平常PHP開發中容易忽略的基礎知識和現代PHP開發中關於規範、部署、優化的一些實戰性建議,同時還有對Javascript語言特色的深刻研究。code