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语言特色的深刻研究。

相关文章
相关标签/搜索