几乎刷完了力扣所有的链表题,我发现了这些东西。。。

转自:https://leetcode-cn.com/circle/article/Ej98dm/

以上就是我们给大家的四个技巧了。相信有了这四个技巧,写链表题就没那么艰难啦~ ^_^
题目推荐
最后推荐几道题给大家,用今天学到的知识解决它们吧~

21. 合并两个有序链表
82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素
86. 分隔链表
92. 反转链表 II
138. 复制带随机指针的链表
141. 环形链表
142. 环形链表 II
143. 重排链表
148. 排序链表
206. 反转链表
234. 回文链表

总结
数组和栈从逻辑上没有大的区别,你看基本操作都是差不多的。如果是单链表,我们无法在 O(1)O(1)O(1) 的时间拿到前驱节点,这也是为什么我们遍历的时候老是维护一个前驱节点的原因。但是本质原因其实是链表的增删操作都依赖前驱节点。这是链表的基本操作,是链表的特性天生决定的。
可能有的同学有这样的疑问”考点你只讲了指针的修改和链表拼接,难道说链表就只会这些就够了?那我做的题怎么还需要我会前缀和啥的呢?你是不是坑我呢?“
我前面说了,所有的数据结构底层都是数组和链表中的一种或两种。而我们这里讲的链表指的是考察链表的基本操作的题目。因此如果题目中需要你使用归并排序去合并链表,那其实归并排序这部分已经不再本文的讨论范围了。
实际上,你去力扣或者其他 OJ 翻链表题会发现他们的链表题大都指的是入参是链表,且你需要对链表进行一些操作的题目。再比如树的题目大多数是入参是树,你需要在树上进行搜索的题目。也就是说需要操作树(比如修改树的指针)的题目很少,比如有一道题让你给树增加一个 right 指针,指向同级的右侧指针,如果已经是最右侧了,则指向空。
链表的基本操作就是增删查,牢记链表的基本操作和复杂度是解决问题的基本。有了这些基本还不够,大家要牢记我的口诀”一个原则,两个考点,三个注意,四个技巧“。
做链表的题,要想入门,无它,唯画图尔。能画出图,并根据图进行操作你就入门了,甭管你写的代码有没有 bug 。
而链表的题目核心的考察点只有两个,一个是指针操作,典型的就是反转。另外一个是链表的拼接。这两个既是链表的精髓,也是主要考点。
知道了考点肯定不够,我们写代码哪些地方容易犯错?要注意什么? 这里我列举了三个容易犯错的地方,分别是环,边界和前后序。
其中环指的是节点之间的相互引用,环的题目如果题目本身就有环, 90 % 双指针可以解决,如果本身没有环,那么环就是我们操作指针的时候留下的。如何解决出现环的问题?那就是画图,然后聚焦子结构,忽略其他信息。
除了环,另外一个容易犯错的地方往往是边界的条件, 而边界这块链表头的判断又是一个大头。克服这点,我们需要认真读题,看题目的要求以及返回值,另外一个很有用的技巧是虚拟节点。
如果大家用递归去解链表的题, 一定要注意自己写的是前序还是后序。

如果是前序,那么只思考子结构即可,前面的已经处理好了,怎么处理的,不用管。非要问,那就是同样方法。后面的也不需考虑如何处理,非要问,那就是用同样方法
如果是后续,那么只思考子结构即可,后面的已经处理好了,怎么处理的,不用管。非要问,那就是同样方法。前面的不需考虑如何处理。非要问,那就是用同样方法

如果你想递归和迭代都写, 我推荐你用前序遍历。因为前序遍历容易改成不用栈的递归。
以上就是链表专题的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
我整理的 1000 多页的电子书已经开发下载了,大家可以去我的公众号《力扣加加》后台回复电子书获取。

作者:lucifer
链接:https://leetcode-cn.com/circle/article/Ej98dm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页