鏈表由一個一個的做爲節點的對象構成的,每個節點都有指向下一個節點的指針,最後一個節點的指針域指向空。每一個節點能夠存儲任何數據類型。git
根據類型能夠分爲單鏈表、雙鏈表、環形鏈表、複雜鏈表等等結構,這些結構又能夠相互組合。github
對這部分基礎內容不太熟悉的同窗能夠看我以前寫的實戰PHP數據結構基礎之單鏈表 以及實戰PHP數據結構基礎之雙鏈表。算法
俗話說光說不練假把式,既然學習了鏈表的基礎概念和基本操做 那咱們必定要找些題目鞏固下,下面來看《劍指offer》中的相關題目。數據結構
輸入一個鏈表,從尾到頭打印鏈表每一個節點的值數據結構和算法
題目分析:這道題仍是比較簡單的,考察的基礎知識,難度係數一顆星。 考察考點:鏈表。post
解答示例:學習
function printListFromTailToHead($head) {
// write code here
$list = [];
$currentNode = $head;
while ($currentNode) {
$list[] = $currentNode->val;
$currentNode = $currentNode->next;
}
return array_reverse($list);
}
複製代碼
輸入一個鏈表,輸出該鏈表中倒數第k個結點。優化
題目分析:依然考察的基礎知識,難度係數一顆星。 考察考點:鏈表。this
解答示例:spa
function FindKthToTail($head, $k) {
$currentNode = $head;
$data = [];
if ($currentNode) {
while ($currentNode) {
$data[] = $currentNode;
$currentNode = $currentNode->next;
}
return $data[count($data) - $k];
}
return null;
}
複製代碼
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。
題目分析:合併兩個排序的鏈表,須要分別比較兩個鏈表的每一個值,而後改變next指針。 考察考點:鏈表。
解答示例:
/*遞歸解法*/
/*class ListNode{ var $val; var $next = NULL; function __construct($x){ $this->val = $x; } }*/
function Merge($pHead1, $pHead2) {
if (is_null($pHead1)) {
return $pHead2;
} elseif (is_null($pHead2)) {
return $pHead1;
}
$merged = new ListNode(null);
if ($pHead1->val < $pHead2->val) {
$merged->val = $pHead1->val;
$merged->next = Merge($pHead1->next, $pHead2);
} else {
$merged->val = $pHead2->val;
$merged->next = Merge($pHead1, $pHead2->next);
}
return $merged;
}
複製代碼
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5
題目分析:保存相同的值,而後判斷相同節點改變前一個節點的next指針便可。 考察考點:鏈表。
解答示例:
/*class ListNode{ var $val; var $next = NULL; function __construct($x){ $this->val = $x; } }*/
function deleteDuplication($pHead) {
$currentNode = $pHead;
$prev = null;
if ($currentNode) {
while ($currentNode) {
if ($currentNode->val == $currentNode->next->val) {
$sameVal = $currentNode->val;
while ($currentNode->val == $sameVal) {
$currentNode = $currentNode->next;
}
//頭節點
if (empty($prev)) {
$pHead = $currentNode;
$currentNode = $pHead;
} else {
//正常節點
$prev->next = $currentNode;
}
} else {
$prev = $currentNode;
$currentNode = $currentNode->next;
}
}
}
return $pHead;
}
複製代碼
兩個鏈表的第一個公共節點
解答示例:
/*class ListNode{ var $val; var $next = NULL; function __construct($x){ $this->val = $x; } }*/
function FindFirstCommonNode($pHead1, $pHead2) {
$currentNode1 = $pHead1;
$currentNode2 = $pHead2;
if ($currentNode1 === $currentNode2) {
return $pHead1;
}
while ($currentNode1 !== $currentNode2) {
$currentNode1 = ($currentNode1 == null ? $pHead2 : $currentNode1->next);
$currentNode2 = ($currentNode2 == null ? $pHead1 : $currentNode2->next);
}
return $currentNode1;
}
複製代碼
PHP基礎數據結構專題系列目錄地址:github.com/... 主要使用PHP語法總結基礎的數據結構和算法。還有咱們平常PHP開發中容易忽略的基礎知識和現代PHP開發中關於規範、部署、優化的一些實戰性建議,同時還有對Javascript語言特色的深刻研究。