摘要:什么是雙鏈表上一篇實戰數據結構基礎之單鏈表說到單鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。
什么是雙鏈表?
上一篇實戰PHP數據結構基礎之單鏈表說到
單鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。每個節點可以存儲任何數據類型。
而雙鏈表每個節點有兩個指針域,分別指向前驅和后繼節點。單鏈表是單向的,而雙鏈表是雙向的。
常見操作對雙鏈表我們常見的操作有如下:
insert
insertBefore
insertAfter
insertAtFirst
insertAtLast
deleteFirst
deleteLast
delete
reverse
getNthNode
...
PHP語言實現首先我們根據定義實現一個雙鏈表的ListNode類。
class ListNode { public $data = null; public $next = null; public $prev = null; public function __construct(string $data) { $this->data = $data; } }
再來看鏈表類,首先需要3個私有屬性,分別是頭節點、尾巴節點和長度。
class DoubleLinkedList { private $head = null; private $last = null; private $length = 0; }
接下來還是老規矩,直接看如何實現第一個即常用的插入,這是是一個平均時間復雜度為O(n)的操作。
/** * 插入一個節點 * @param string|null $data * @return bool * complexity O(n) */ public function insert(string $data = null) { $newNode = new ListNode($data); if ($this->head) { $currentNode = $this->head; while ($currentNode) { if ($currentNode->next === null) { $currentNode->next = $newNode; $newNode->prev = $currentNode; $this->last = $newNode; $this->length++; return true; } $currentNode = $currentNode->next; } } else { $this->head = &$newNode; $this->last = $newNode; $this->length++; return true; } }
再來看如何刪除節點。
/** * 刪除一個節點 * @param string $data * @return bool|ListNode * complexity O(n) */ public function delete(string $query = null) { if ($this->head) { $currentNode = $this->head; $prevNode = null; while ($currentNode) { if ($currentNode->data === $query) { if ($nextNode = $currentNode->next) { if ($prevNode) { $prevNode->next = $nextNode; $nextNode->prev = $prevNode; } else { $this->head = $nextNode; $nextNode->prev = null; } unset($currentNode); } else { if ($prevNode) { $this->last = $prevNode; $prevNode->next = null; unset($currentNode); } else { $this->head = null; $this->last = null; } } $this->length--; return true; } $prevNode = $currentNode; $currentNode = $currentNode->next; } } return false; }
反轉雙鏈表也不是很復雜。
public function reverse() { if ($this->head !== null) { if ($this->head->next !== null) { $reversedList = null; $currentNode = $this->head; while ($currentNode !== null) { $next = $currentNode->next; $currentNode->next = $reversedList; $currentNode->prev = $next; $reversedList = $currentNode; $currentNode = $next; } $this->last = $this->head; $this->head = $reversedList; } } }
雙鏈表其他操作的詳細實現可以參考 這里。
雙鏈表是鏈表這種鏈式存取數據結構中相對于單鏈表比較特殊的部分,同樣屬于鏈表結構的還有單鏈表,環形鏈表和多鏈表。
專題系列PHP基礎數據結構專題系列目錄地址:https://github.com/... 主要使用PHP語法總結基礎的數據結構和算法。還有我們日常PHP開發中容易忽略的基礎知識和現代PHP開發中關于規范、部署、優化的一些實戰性建議,同時還有對Javascript語言特點的深入研究。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28817.html
摘要:劍指中鏈表相關題目俗話說光說不練假把式,既然學習了鏈表的基礎概念和基本操作那我們一定要找些題目鞏固下,下面來看劍指中的相關題目。題目分析合并兩個排序的鏈表,需要分別比較兩個鏈表的每個值,然后改變指針。 溫故知新 鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。每個節點可以存儲任何數據類型。 根據類型可以分為單鏈表、雙鏈表、環形鏈表、...
摘要:常見操作對單鏈表我們常見的操作有如下語言實現首先我們根據定義實現一個類。單鏈表是鏈表這種鏈式存取數據結構中基礎的部分,同樣屬于鏈表結構的還有雙鏈表,環形鏈表和多鏈表。專題系列基礎數據結構專題系列目錄地址主要使用語法總結基礎的數據結構和算法。 什么是鏈表? 鏈表由一個一個的作為節點的對象構成的,每一個節點都有指向下一個節點的指針,最后一個節點的指針域指向空。每個節點可以存儲任何數據類型。...
摘要:棧和隊列棧和隊列和之前講到的實戰數據結構基礎之雙鏈表一樣都是線性結構。來看基于數組的棧實現得益于強大的結構,我們輕而易舉的寫出來了棧的基本操作方法。專題系列基礎數據結構專題系列目錄地址主要使用語法總結基礎的數據結構和算法。 棧和隊列 棧和隊列和之前講到的實戰PHP數據結構基礎之雙鏈表 一樣都是線性結構。 棧有什么特點 棧遵循后進先出的原則(LIFO)。這意味著棧只有一個出口用來壓入元素...
摘要:一般我們都構造雙向循環鏈表。循環鏈表的操作和單鏈表的操作基本一致,差別僅僅在于算法中的循環條件有所不同。單向循環鏈表雙向循環鏈表單向循環鏈表是在單鏈表基礎上,將最后一個節點的指針指向鏈表頭。 維基百科 雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。一般我們都構...
閱讀 1200·2021-11-24 11:16
閱讀 3428·2021-11-15 11:38
閱讀 1920·2021-10-20 13:47
閱讀 546·2021-09-29 09:35
閱讀 2192·2021-09-22 15:17
閱讀 1013·2021-09-07 09:59
閱讀 3374·2019-08-30 13:21
閱讀 2904·2019-08-30 12:47