PHP資料結構基礎之雙鏈表

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP資料結構基礎之雙鏈表,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

什麼是雙鏈表?

上一篇實戰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語言特點的深入研究。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.