less than 1 minute read

记录近期刷链表相关题目的思路和细节,方便日后复习。


1. 链表理论基础

理论内容,略


2. 移除链表元素

虚拟头节点这里我没用到,下次可以考虑使用,移除head节点的特殊性。
递归有机会可以试试,虽然空间复杂度不好,但是思维可以锻炼一下。


3. 设计链表

需要重点注意一下,算法题写多了容易忘记底层基础设计,写的时候发现难以下笔。


4. 翻转链表

简单,略


5. 两两交换链表中的节点

和随想录作者说的一样,动笔简单画图会思路清晰很多,不容易出错


6. 删除链表的倒数第N个节点

快慢指针可以稍作考虑,快的先跳,然后协同一对一。看起来区别不大。


7. 链表相交

如果题干描述改一下要求,加上环并修改一下判断条件,会有一些有趣的情况


8. 环形链表II

重点,建议写完后详细阅读随想录里的内容。判断环、环入口的数学公式不难但思路可贵。


AI在算法刷题中作用的感想

的确,未来语法问题的考察肯定会越来越弱,毕竟工作后AI可以节省大量时间。这也让我一开始想要自己先有思路骨架,然后交给AI填充。但是,在这两周刷题的过程中,我发现敲代码卡壳时多半不是因为忘记了什么语法知识点或细节,而是在逻辑上有所卡壳,但却下意识的以为是繁琐的语法的锅——例如,用java写一段递归算法+if else分支时,真正消耗时间的不是细枝末节的变量定义/自增自减或赋值存储,而是在每一个场景下应当考虑到什么边界情况,此处的逻辑能否在所有初始状况下合理运转不出现bug,数据量大时是否会空间爆炸,时间复杂度是否合规等。

当我有了一个基本的思路直接喂给AI,AI会把上述所有内容自动优化好给我——这当然是极为有用的。

然而,这会让我们产生错觉,以为自己已经彻底掌握了这道题的本质,但工程性的很多必要锻炼其实都偷懒了。这样经过算法训练的人,未来撰写大工程里的代码时,未必会有企业所需要的性能与安全意识,很可能是随便写写然后把一切优化责任交给AI,我觉得这是对自己的弱化。在当今AI还无法承担大工程量代码没有幻觉的优化时,我认为培养自己随时优化时空复杂度与注意各种边界情况、对各种少见场景的想象能力是有必要的。工程软件的许多bug都来自于前期未能设想到的场景,在算法刷题中有意识的训练自己这方面的能力不仅有趣,更能让自己的竞争力差异化。因此,刷题时采用智能语法补全是可行之举,但直接把文字思路或简陋的伪代码喂给AI再拿着AI的反馈提交或许是不太合适的——至少在优化与场景想象能力建立起来前,会削弱我们刷题获得的思维提升。