标签:存储方式 应该 内存 fas 插入 展开 分享 存储 如何
给「代码随想录」一个星标吧!?
链表的理论基础
在这篇文章关于链表,你该了解这些!中,介绍了如下几点:
链表经典题目
虚拟头结点
在链表:听说用虚拟头节点会方便很多?中,我们讲解了链表操作中一个非常重要的技巧:虚拟头节点。
链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。
「每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题」。
在链表:听说用虚拟头节点会方便很多?中,我给出了用虚拟头结点和没用虚拟头结点的代码,大家对比一下就会发现,使用虚拟头结点的好处。
链表的基本操作
在链表:一道题目考察了常见的五个操作!中,我们通设计链表把链表常见的五个操作练习了一遍。
这是练习链表基础操作的非常好的一道题目,考察了:
这里我依然使用了虚拟头结点的技巧,大家复习的时候,可以去看一下代码。
反转链表
在链表:听说过两天反转链表又写不出来了?中,讲解了如何反转链表。
因为反转链表的代码相对简单,有的同学可能直接背下来了,但一写还是容易出问题。
反转链表是面试中高频题目,很考察面试者对链表操作的熟练程度。
我在文章中,给出了两种反转的方式,迭代法和递归法。
建议大家先学透迭代法,然后再看递归法,因为递归法比较绕,如果迭代还写不明白,递归基本也写不明白了。
「可以先通过迭代法,彻底弄清楚链表反转的过程!」
环形链表
在链表:环找到了,那入口呢?中,讲解了在链表如何找环,以及如何找环的入口位置。
这道题目可以说是链表的比较难的题目了。
很多同学关注的问题是:为什么一定会相遇,快指针就不能跳过慢指针么?
可以确定如下两点:
确定有否有环比较容易,但是找到环的入口就不太容易了,需要点数学推理。
我在链表:环找到了,那入口呢?中给出了详细的推理,兼顾易懂和简洁了。
这是一位录友在评论区有一个疑问。我感觉这个问题很不错,但评论区根本说不清楚,趁着总结篇,补充一下这个证明。
在推理过程中,「为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?」
了解这个问题一定要先把文章链表:环找到了,那入口呢?看了,即文章中如下的地方:
首先slow进环的时候,fast一定是先进环来了。
如果slow进环入口,fast也在环入口,那么把这个环展开成直线,就是如下图的样子:
可以看出如果slow 和 fast同时在环入口开始走,一定会在环入口3相遇,slow走了一圈,fast走了两圈。
重点来了,slow进环的时候,fast一定是在环的任意一个位置,如图:
那么fast指针走到环入口3的时候,已经走了k + n 个节点,slow相应的应该走了(k + n) / 2 个节点。
因为k是小于n的(图中可以看出),所以(k + n) / 2 一定小于n。
「也就是说slow一定没有走到环入口3,而fast已经到环入口3了」。
这说明什么呢?
「在slow开始走的那一环已经和fast相遇了」。
那有同学又说了,为什么fast不能跳过去呢?在刚刚已经说过一次了,「fast相对于slow是一次移动一个节点,所以不可能跳过去」。
好了,这次把为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y ,用数学推理了一下,算是对链表:环找到了,那入口呢?的补充。
这次可以说把环形链表这道题目的各个细节,完完整整的证明了一遍,说这是全网最详细讲解不为过吧,哈哈。
总结
考察链表的操作其实就是考察指针的操作,是面试中的常见类型。
链表篇中开头介绍链表理论知识,然后分别通过经典题目介绍了如下知识点:
如果希望从基础学起来的同学,也可以从头学起来,从头开始打卡,打卡的同时也总结自己的所学所思,一定进步飞快!
「在公众号左下方,「算法汇总」可以找到历史文章,都是按系列排好顺序的,快去通关学习吧!」
「「代码随想录」这么用心的公众号,不分享给身边的同学朋友啥的,是不是可惜了?哈哈」
标签:存储方式 应该 内存 fas 插入 展开 分享 存储 如何
原文地址:https://blog.51cto.com/15069438/2576395