PHP實現常用的資料結構之鍊錶

2021-08-21 14:05:42 字數 3092 閱讀 4737

tips:因為涉及指標,我們用引用來模擬,所以讀者應該有物件導向的知識貯備。
你可以把鍊錶簡單理解為動態陣列,它不需要一塊一塊的開闢空間,同時,你又要注意,它存在的主要意義或者說使用場景主要是」指標功能「,它能夠指來指去,對一些應用特別是記憶體管理起到了關鍵作用。

因為涉及記憶體,常常會有一些程式的邊界限制,需要programer擁有一定嚴密的邏輯去保證**的健壯性,所以這個知識點是面試的常考點。下面我們看看php的單鏈表實現(附常考題目實現):

<?php

/** * php 單鏈表

* author:entner

* time :2017-8-14

* email :[email protected]

*//**

* todo:構建鍊錶節點

*/class node

}/**

* todo:構建單鏈表

*/class singlelinklist

return $head;

}/* 尾插法建立鍊錶 */

public function rearinsert($n)

return $rear;

}/**

* todo:讀取鍊錶中第i個資料

* @param $list object 待插入的鍊錶

* @param $i int 節點序號

*/public function readithnode($list,$i)

/* */

$p = $list->next; #設定p指向第乙個節點(即頭節點的後繼節點))

$j=0; #計時器必須初始化

while($p && $j<$i )

/* 第i步 */

if($p == null)else

}/**

* todo:在鍊錶的第i個位置之前插入節點e

* @param $list object 待插入的鍊錶

* @param $i int 節點序號

* @param $e object 待插入的節點

*/public function insert($list,$i,$e)

$p = $list->next; #設定p指向第乙個節點

$j=0; #計時器必須初始化

while($p && $j<$i )

/* 第i步 */

if($p == null)else

}/**

* todo:刪除鍊錶的第i個節點,並返回該節點的值

* @param $list object 待插入的鍊錶

* @param $i int 節點序號

*/public function delete($list,$i)

$p = $list->next; #設定p指向第乙個節點

$j=0; #計時器必須初始化

while($p && $j<$i )

/* 第i步 */

if($p == null)else

}/**

* todo:刪除整張鍊錶

* @param $list object 待插入的鍊錶

*/public function deleteall($list)

$p = $list->next; #設定p指向第乙個節點

while($p != null )

}/**

* question1:輸出倒數第k個節點

* @param $head object 鍊錶

* @param $k int 序號

*/function findkthtotail($head, $k)

/* 這裡採用了複雜度為o(n)的演算法,需要準備兩個節點 */

$behind = $head; #指向鍊錶的第乙個節點

/* 演算法思路:準備兩個指標,假如第乙個指標走到n-1(即鍊錶末尾),第二個指標走到倒數k的位置,兩者之間相差(n-1)-(n-k) = k-1 */

for($i=0;$i<$k-1;$i++)else

}/* 當第乙個指標走到k-1且還不為空,這時讓第二個指標開始走,當第乙個指標走到n-1的時候,第二個指標也走到了倒數第k的位置,即所求 */

while($head->next != null)

return $behind;

}/**

* question2:反轉鍊錶

* @param $head object 鍊錶

*/public function reverselist($phead)

$pre = $phead; #前一節點 ,這裡是根節點

$cur = $pre->next; #當前節點 2 例:1->2->3

$next = null; #後一節點

/* 鍊錶存在且不為空 */

while(!$cur)

return $pre;}}

$object = new singlelinklist();

$result = (new singlelinklist)->headinsert(4);

$pre = $object->reverselist($result);

//$behind = $object->findkthtotail($result,1);

// $e = $object->readithnode($result,2);

// echo $e;

// $newnode = new node(6,null);

// $newlist = $object->insert($result,2,$newnode);

// $e = $object->delete($result,2);

echo "";

// print_r($result);

print_r($pre);

PHP資料結構之 鍊錶

鍊錶是一種在邏輯上連續 有序的資料儲存結構 在物理儲存單元上非連續非有序 在我大學的時候,學習c 的資料結構課程時,最先接觸的就是鍊錶 大學是學渣別噴.那麼鍊錶是怎樣的一種結構呢?用 形象的 文本來描述就是 node 1 node 2 node 3 node 4 node n 每乙個node包含一些...

PHP 資料結構 反轉鍊錶PHP實現

1.常見方法分為迭代和遞迴,迭代是從頭到尾,遞迴是從尾到頭 2.設定兩個指標,old和new,每一項新增在new的後面,新煉表頭指標指向新的煉表頭 3.old next不能直接指向new,而是應該設定乙個臨時指標tmp,指向old next指向的位址空間,儲存原鍊錶資料,然後old next指向ne...

資料結構之鍊錶的實現

一.單向鍊錶的建立,節點的插入和刪除 1.鍊錶建立 注意鍊錶的第乙個節點是空的 include include include typedef struct lnodelnode,linklist linklist createlist int n void print linklist h int...