實戰PHP資料結構基礎之單連結串列

蕭瀟發表於2018-06-09

什麼是連結串列?

連結串列由一個一個的作為節點的物件構成的,每一個節點都有指向下一個節點的指標,最後一個節點的指標域指向空。每個節點可以儲存任何資料型別。

常見操作

對單連結串列我們常見的操作有如下:

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

PHP語言實現

首先我們根據定義實現一個ListNode類。

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;
        }
    }

}
複製程式碼

單連結串列其他操作的詳細實現可以參考 這裡

單連結串列是連結串列這種鏈式存取資料結構中基礎的部分,同樣屬於連結串列結構的還有雙連結串列,環形連結串列和多連結串列。

專題系列

PHP基礎資料結構專題系列目錄地址:github.com/... 主要使用PHP語法總結基礎的資料結構和演算法。還有我們日常PHP開發中容易忽略的基礎知識和現代PHP開發中關於規範、部署、優化的一些實戰性建議,同時還有對Javascript語言特點的深入研究。

相關文章