實戰PHP數據結構基礎之單鏈表

什麼是鏈表?

鏈表由一個一個的做爲節點的對象構成的,每個節點都有指向下一個節點的指針,最後一個節點的指針域指向空。每一個節點能夠存儲任何數據類型。git

常見操做

對單鏈表咱們常見的操做有以下:github

  • insert
  • insertBefore
  • insertAfter
  • insertAtFirst
  • search
  • deleteFirst
  • deleteLast
  • delete
  • reverse
  • getNthNode
  • ...

PHP語言實現

首先咱們根據定義實現一個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

相關文章
相關標籤/搜索