成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【php實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)】單向鏈表

piapia / 1995人閱讀

摘要:什么是單向鏈表鏈表是以鏈?zhǔn)酱鎯?chǔ)數(shù)據(jù)的結(jié)構(gòu),其不需要連續(xù)的存儲(chǔ)空間,鏈表中的數(shù)據(jù)以節(jié)點(diǎn)來表示,每個(gè)節(jié)點(diǎn)由元素存儲(chǔ)數(shù)據(jù)和指針指向后繼節(jié)點(diǎn)組成。單向鏈表也叫單鏈表是鏈表中最簡單的一種形式,每個(gè)節(jié)點(diǎn)只包含一個(gè)元素和一個(gè)指針。

什么是單向鏈表

鏈表是以鏈?zhǔn)酱鎯?chǔ)數(shù)據(jù)的結(jié)構(gòu),其不需要連續(xù)的存儲(chǔ)空間,鏈表中的數(shù)據(jù)以節(jié)點(diǎn)來表示,每個(gè)節(jié)點(diǎn)由元素(存儲(chǔ)數(shù)據(jù))和指針(指向后繼節(jié)點(diǎn))組成。

單向鏈表(也叫單鏈表)是鏈表中最簡單的一種形式,每個(gè)節(jié)點(diǎn)只包含一個(gè)元素和一個(gè)指針。
它有一個(gè)表頭,并且除了最后一個(gè)節(jié)點(diǎn)外,所有節(jié)點(diǎn)都有其后繼節(jié)點(diǎn)。
它的存儲(chǔ)結(jié)構(gòu)如下圖所示

代碼實(shí)現(xiàn)

定義節(jié)點(diǎn)

class Node
{
    public $data;

    /**
     * @var null | Node
     */
    public $next;

    public function __construct($data)
    {
        $this->data = $data;
        $this->next = null;
    }

}

單鏈表實(shí)現(xiàn)

/**
 * Class SingleLinkList
 * 單鏈接的實(shí)現(xiàn)示例,實(shí)現(xiàn)簡單的填加,插入,刪除, 查詢,長度,遍歷這幾個(gè)簡單操作
 */
class SingleLinkList
{
    /**
     * 鏈表頭結(jié)點(diǎn),頭節(jié)點(diǎn)必須存在,
     * @var Node
     */
    public $header;

    private $size = 0;

    /**
     * 構(gòu)造函數(shù),默認(rèn)填加一個(gè)哨兵節(jié)點(diǎn),該節(jié)點(diǎn)元素為空
     * SingleLinkList constructor.
     */
    public function __construct()
    {
        $this->header = new Node(null);
    }

    /**
     * 在鏈表末尾添加節(jié)點(diǎn)
     * @param Node $node
     * @return int
     */
    public function addNode(Node $node)
    {
        $current = $this->header;
        while ($current->next != null) {
            $current = $current->next;
        }
        $current->next = $node;

        return ++$this->size;
    }

    /**
     * 在指定位置插入節(jié)點(diǎn)
     * @param int $index 節(jié)點(diǎn)位置,從1開始計(jì)數(shù)
     * @param Node $node
     * @return int
     * @throws Exception
     */
    public function insertNodeByIndex($index, Node $node)
    {
        if ($index < 1 || $index > ($this->size + 1)) {
            throw new Exception(sprintf("你要插入的位置,超過了鏈表的長度 %d", $this->size));
        }

        $current = $this->header;
        $tempIndex = 1;
        do {
            if ($index == $tempIndex++) {
                $node->next = $current->next;
                $current->next = $node;
                break;
            }
        } while ($current->next != null && ($current = $current->next));

        return ++$this->size;
    }

    /**
     * 刪除節(jié)點(diǎn)
     * @param int $index 節(jié)點(diǎn)位置,從1開始計(jì)數(shù)
     * @return int
     * @throws Exception
     */
    public function deleteNodeByIndex($index)
    {
        if ($index < 1 || $index > ($this->size + 1)) {
            throw new Exception("你刪除的節(jié)點(diǎn)不存在");
        }

        $current = $this->header;
        $tempIndex = 1;
        do {
            if ($index == $tempIndex++) {
                $current->next = $current->next->next;
                break;
            }
        } while ($current->next != null && ($current = $current->next));

        return --$this->size;
    }

    /**
     * 查詢節(jié)點(diǎn)
     * @param int $index 節(jié)點(diǎn)位置,從1開始計(jì)數(shù)
     * @return Node|null
     * @throws Exception
     */
    public function searchNodeByIndex($index) {
        if ($index < 1 || $index > ($this->size + 1)) {
            throw new Exception("你查詢的節(jié)點(diǎn)不存在");
        }

        $current = $this->header;
        $tempIndex = 1;
        do {
            if ($index == $tempIndex++) {
                return $current->next;
            }
        } while ($current->next != null && ($current = $current->next));
    }

    /**
     * 獲取節(jié)點(diǎn)長度
     * @return int
     */
    public function getLength()
    {
        return $this->size;
    }

    /**
     * 遍歷列表
     */
    public function showNode()
    {
        $current = $this->header;
        $index = 1;
        while ($current->next != null) {
            $current = $current->next;
            echo "index --- " . $index++ . " --- ";
            echo var_export($current->data);
            echo PHP_EOL;
        }
    }
}

示例

$link = new SingleLinkList();
$link->addNode(new Node(1));
$link->addNode(new Node(2));
$link->insertNodeByIndex(3, new Node(3));
$link->addNode(new Node(4));
$link->addNode(new Node(5));
echo $link->getLength(), PHP_EOL;
$link->showNode();
echo "-----------", PHP_EOL;
var_dump($link->searchNodeByIndex(3));
echo "-----------", PHP_EOL;
$link->deleteNodeByIndex(3);
$link->showNode();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29873.html

相關(guān)文章

  • PHP面試??贾?em>數(shù)據(jù)結(jié)構(gòu)——鏈表的概念

    摘要:一鏈表鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的指針。指向整個(gè)列表的指針可以被稱作訪問指針。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.18至3.22)的一三五更新的文章如下: 周一:PHP面試常考之?dāng)?shù)據(jù)結(jié)構(gòu)——鏈表的概念周三:PHP面試??贾?dāng)?shù)據(jù)結(jié)構(gòu)——棧和隊(duì)列周五:PHP面試常考之...

    dreamans 評(píng)論0 收藏0
  • 圖解幾種常見的線性表

    摘要:下面來看一下,有哪些數(shù)據(jù)結(jié)構(gòu)屬于線性表吧棧特性先進(jìn)后出只有唯一的一個(gè)出入口介紹棧又名堆棧,它是一種運(yùn)算受限的線性表。 原文是在我自己博客中,小伙伴也可以點(diǎn)閱讀原文進(jìn)行跳轉(zhuǎn)查看,還有好聽的背景音樂噢背景音樂已取消~ 2333333 線性表 什么是線性表?就是一種連續(xù)或間斷存儲(chǔ)的數(shù)組,這里的連續(xù)和間斷是針對(duì)物理內(nèi)存空間中線性表元素之間是否連續(xù),其中連續(xù)數(shù)組對(duì)應(yīng)內(nèi)置數(shù)組的實(shí)現(xiàn)方式,間斷數(shù)組對(duì)...

    wawor4827 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表

    摘要:實(shí)現(xiàn)移除給定的元素要移除的元素返回值表示移除成功方法說明移除單向鏈表中某個(gè)位置的元素。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法二鏈表 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第四篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與...

    lolomaco 評(píng)論0 收藏0
  • JavaScript的數(shù)據(jù)結(jié)構(gòu)與算法(三) —— 單向鏈表

    摘要:鏈表鏈表存儲(chǔ)有序的元素集合,但不同于數(shù)組,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。相對(duì)于傳統(tǒng)的數(shù)組,鏈表的一個(gè)好處在于,添加或者刪除元素的時(shí)候不需要移動(dòng)其他元素。 鏈表 鏈表存儲(chǔ)有序的元素集合,但不同于數(shù)組,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。每個(gè)元素由一個(gè)存儲(chǔ)元素本事的節(jié)點(diǎn)和一個(gè)指向下一個(gè)元素的引用組成。相對(duì)于傳統(tǒng)的數(shù)組,鏈表的一個(gè)好處在于,添加或者刪除元素的時(shí)候不需要移動(dòng)其他元素。...

    李濤 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<