php實現基本數據結構之鏈表

鏈表

鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,可是並不會按線性的順序存儲數據,而是在每個節點裏存到下一個節點的指針(Pointer)。php

使用鏈表結構能夠克服數組鏈表須要預先知道數據大小的缺點,鏈表結構能夠充分利用計算機內存空間,實現靈活的內存動態管理。可是鏈表失去了數組隨機讀取的優勢,同時鏈表因爲增長告終點的指針域,空間開銷比較大。node

鏈表有不少種不一樣的類型:單向鏈表,雙向鏈表以及循環鏈表。數組

單向鏈表

鏈表中最簡單的一種是單向鏈表,它包含兩個域,一個信息域和一個指針域。這個連接指向列表中的下一個節點,而最後一個節點則指向一個空值。緩存

PHP實現簡單的單向鏈表bash

<?php

class Node
{
    private $Data;//節點數據
    private $Next;//存儲下個點對象

    public function __construct($data, $next)
    {
        $this->Data = $data;
        $this->Next = $next;
    }

    public function __set($name, $value)
    {
        if (isset($this->$name))
            $this->$name = $value;
    }

    public function __get($name)
    {
        if (isset($this->$name))
            return $this->$name;
        else
            return NULL;
    }
}

class LinkList
{
    private $head;//頭節點
    private $len;

    /**
     * 初始化頭節點
     */
    public function __construct()
    {
        $this->init();
    }

    public function setHead(Node $val)
    {
        $this->head = $val;
    }

    public function getHead()
    {
        return $this->head;
    }

    public function getLen()
    {
        return $this->len;
    }

    public function init()
    {
        $this->setHead(new Node(NULL, NULL));
        $this->len = 0;
    }

    /**
     * 設置某位置節點的數據
     * @param int $index
     * @param $data
     * @return bool
     */
    public function set(int $index, $data)
    {
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL && $i <= $index) {
            $node = $node->Next;
            $i++;
        }
        $node->Data = $data;
        return TRUE;
    }

    /**
     * 獲取某位置節點的數據
     * @param int $index
     * @return mixed
     */
    public function get(int $index)
    {
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL && $i <= $index) {
            $node = $node->Next;
            $i++;
        }
        return $node->Data;
    }

    /**
     * 在某位置處插入節點
     * @param $data
     * @param int $index
     * @return bool
     */
    public function insert($data, int $index = 0)
    {
        if ($index <= 0 || $index > $this->getLen())
            return FALSE;
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL) {
            if ($index === $i) break;
            $node = $node->Next;
            $i++;
        }
        $node->Next = new Node($data, $node->Next);
        $this->len++;
        return TRUE;
    }

    /**
     * 刪除某位置的節點
     * @param int $index
     * @return bool
     */
    public function delete(int $index)
    {
        if ($index <= 0 || $index > $this->getLen())
            return FALSE;
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL) {
            if ($index === $i) break;
            $node = $node->Next;
            $i++;
        }
        $node->Next = $node->Next->Next;
        $this->len--;
        return TRUE;
    }
}
複製代碼

雙向鏈表 一種更復雜的鏈表是「雙向鏈表」或「雙面鏈表」。每一個節點有兩個鏈接:一個指向前一個節點,(當此「鏈接」爲第一個「鏈接」時,指向空值或者空列表);而另外一個指向下一個節點,(當此「鏈接」爲最後一個「鏈接」時,指向空值或者空列表)數據結構

循環鏈表 在一個 循環鏈表中,首節點和末節點被鏈接在一塊兒。這種方式在單向和雙向鏈表中皆可實現。要轉換一個循環鏈表,你開始於任意一個節點而後沿着列表的任一方向直到返回開始的節點。再來看另外一種方法,循環鏈表能夠被視爲「無頭無尾」。這種列表很利於節約數據存儲緩存,假定你在一個列表中有一個對象而且但願全部其餘對象迭代在一個非特殊的排列下。 指向整個列表的指針能夠被稱做訪問指針。ui

基本思路都差很少有時間繼續更新this

相關文章
相關標籤/搜索