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...