本篇将介绍关于链表算法的基本解体思路与经典问题,本篇不仅仅追求的是写出优秀的链表代码,更在意的是在有限时间内,如何写出bug free的链表代码。
链表问题的一般解题思路:
链表是一种利用不连续的内存块,通过在每块内存中存储下一块内存的指针而构造的线性存储结构,所以链表是线性表的一种形式。
链表问题是一种考察基本编码能力的问题,这类问题的特点是解法并不复杂,难点在于证明解法的正确性,以及如何编码。即,考察是否能编写出 bug free 的代码,少数会考察算法的数学证明问题。
使用画图的技巧,释放一部分大脑空间。通过画出几个小规模的实例来思考问题,如果问题需要三个以上指针才能解决,那么画图的时间成本,是可以被接受的。
通过画出一般情况下的案例,思考算法的主体解体思路。一般是3-5个节点的情况下。
这时,更重要的是不要马上编码,而是在举出几个特殊实例,来验证一般思路在特殊场景下是否健壮,一般是0,1,2,3,4个数的链表节点,以及链表指针在头节点,与尾节点是否能正常工作。
一定要有耐心,不要图快而提交代码,链表问题就是在锻炼你的代码review能力,思路很简单,难点在于耐下心来,冷静的分析。相信我,你总是能找到第一次编码中的问题。
那么什么是一般性的思路呢?
这是一种模式,链表问题的算法思想就是那么几种,掌握后套用即可,数学证明看几道典型案例即可,真正的难点在于编码,链表问题是涉及指针操作,极易出错,写出 bug free 是很不容的事情,所以最重要的就是要多加练习。
经典链表问题:
1.设计单链表:
这里利用了哨兵的思想
2.判断链表是否有环
双指针思想经典三问:判读链表是否有环,链表与环的交点,求环的长度。
定义两个指针,从头开始,一个每次走2步,一个走一步,二者相交则有环,不相交走两步的指针先到尾部,则判读无环。
public boolean hasCycle(ListNode head){
if(head =