PHPer也刷《劍指Offer》之鏈表

溫故知新

鏈表由一個一個的做爲節點的對象構成的,每個節點都有指向下一個節點的指針,最後一個節點的指針域指向空。每一個節點能夠存儲任何數據類型。git

根據類型能夠分爲單鏈表、雙鏈表、環形鏈表、複雜鏈表等等結構,這些結構又能夠相互組合。github

對這部分基礎內容不太熟悉的同窗能夠看我以前寫的實戰PHP數據結構基礎之單鏈表 以及實戰PHP數據結構基礎之雙鏈表算法

《劍指offer》中鏈表相關題目

俗話說光說不練假把式,既然學習了鏈表的基礎概念和基本操做 那咱們必定要找些題目鞏固下,下面來看《劍指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語言特色的深刻研究。

相關文章
相關標籤/搜索