数据结构与算法之美
王争
前 Google 工程师
283751 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

07 | 链表(下):如何轻松写出正确的链表代码?

常见链表操作的练习
练习的重要性
举例画图的步骤
举例法和画图法的作用
常见的边界条件
边界条件的重要性
哨兵的作用
带头链表和不带头链表
删除操作中的内存泄漏
插入操作中的指针丢失
指针的使用
指针的概念
课后思考
内容小结
技巧六:多写多练,没有捷径
技巧五:举例画图,辅助思考
技巧四:重点留意边界条件处理
技巧三:利用哨兵简化实现难度
技巧二:警惕指针丢失和内存泄漏
技巧一:理解指针或引用的含义
如何轻松写出正确的链表代码?

该思维导图由 AI 生成,仅供参考

上一节我讲了链表相关的基础知识。学完之后,我看到有人留言说,基础知识我都掌握了,但是写链表代码还是很费劲。哈哈,的确是这样的!
想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转、有序链表合并等,写的时候非常容易出错。从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%。
为什么链表代码这么难写?究竟怎样才能比较轻松地写出正确的链表代码呢?
只要愿意投入时间,我觉得大多数人都是可以学会的。比如说,如果你真的能花上一个周末或者一整天的时间,就去写链表反转这一个代码,多写几遍,一直练到能毫不费力地写出 Bug free 的代码。这个坎还会很难跨吗?
当然,自己有决心并且付出精力是成功的先决条件,除此之外,我们还需要一些方法和技巧。我根据自己的学习经历和工作经验,总结了几个写链表代码技巧。如果你能熟练掌握这几个技巧,加上你的主动和坚持,轻松拿下链表代码完全没有问题。

技巧一:理解指针或引用的含义

事实上,看懂链表的结构并不是很难,但是一旦把它和指针混在一起,就很容易让人摸不着头脑。所以,要想写对链表代码,首先就要理解好指针。
我们知道,有些语言有“指针”的概念,比如 C 语言;有些语言没有指针,取而代之的是“引用”,比如 Java、Python。不管是“指针”还是“引用”,实际上,它们的意思都是一样的,都是存储所指对象的内存地址。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

写链表代码的六个技巧 这篇文章分享了写链表代码的六个技巧,帮助读者更轻松地理解和编写链表代码。首先,强调了理解指针或引用的含义的重要性,指出指针实际上是存储所指对象的内存地址,通过指针可以找到相应的变量或对象。其次,提醒读者要警惕指针丢失和内存泄漏的问题,特别是在链表操作中,需要注意操作的顺序,避免出现指针丢失和内存泄漏的情况。技巧三介绍了利用哨兵简化实现难度,通过引入哨兵结点,统一了链表的插入和删除操作的代码实现逻辑。技巧四强调了重点留意边界条件处理,指出在编写链表代码时,需要特别注意边界条件下代码的正确性。技巧五提到了举例画图,辅助思考,建议读者在处理复杂的链表操作时,可以通过举例和画图的方式释放脑容量,更清晰地思考问题。最后,技巧六强调了多写多练,没有捷径,建议读者多练习常见的链表操作,熟能生巧。文章内容丰富,涵盖了链表操作的多个方面,为读者提供了全面的学习指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(598)

  • 最新
  • 精选
  • zeta
    置顶
    建议大家在实现之前的思考时间不要太长。一是先用自己能想到的暴力方法实现试试。另外就是在一定时间内(比如半个到一个小时)实在想不到就要在网上搜搜答案。有的算法,比如链表中环的检测,的最优解法还是挺巧妙的,一般来说不是生想就能想到的

    作者回复: 👍,高手!实际上,写链表代码还是主要为了锻炼写代码的能力,倒不是思考解决办法。像环的检测这种解决办法我也想不出来,都是看了答案之后恍然大悟。

    2018-10-06
    20
    847
  • 0xFFFFFFFF
    练习题LeetCode对应编号:206,141,21,19,876。大家可以去练习,另外建议作者兄每章直接给出LC的题目编号或链接方便大家练习。

    作者回复: 我可以集中写一篇练习题的。现在这种思考题的方式是早就定好的了。不好改了。

    2018-10-06
    52
    1021
  • 五岳寻仙
    老师您好!请教您一个问题。在学习了数组和链表之后,想知道在现实应用中有没有将二者结合起来的情况。 比如,我想用数组存储数据,但数组大小提前无法知道,如果使用动态数组的话,中间涉及到数组拷贝;如果使用链表的话,每增加一个元素都要malloc一次(频繁的malloc会不会影响效率并且导致内存碎片?)。 可不可以用链表将数组链接起来?也就是说链表里每个node存储了数组指针,这样每增加一个节点就可以多存放很多元素。如果可以的话,与直接使用动态数组或者直接使用链表比有没有什么优缺点,为何在网上搜索几乎找不到人这样用?

    作者回复: 👍 思考的深入 你说的这个很像内存池 你可以百度一下看看是不是你想要的

    2018-10-07
    23
    96
  • 小喵喵
    学习了好几节数据结构和算法了,我是也CRUD业务代码的,感觉还是用不着啊?

    作者回复: 1. 建议再看下“为什么要学习数据结构和算法”那节课,包括里面的留言,有很多留言都写的很好,很多人都对这门课有比较清晰深刻的认识。 2. 你的疑问应该是:局限于你现在的工作,你觉得用不上对吧。这个是很有可能的。如果你做的项目都是很小的项目,也没有什么性能压力,平时自己也不去思考非功能性的需求,只是完成业务代码就ok了,那确实感觉用不到。但这是你个人的原因,并不代表就真用不到呢,兄弟! 3. 专栏里有很多贴近开发的内容,比如链表这一节,我就讲了LRU算法。数组这一节,我讲了容器和数组的选择。复杂度这一节,我讲了如何预判代码的性能。这些都是很贴合开发的。 4. 我尽量将内容贴近实际的开发,但并不代表一定贴近你的CRUD开发。知识如何用到你的项目中,需要你自己根据我的文章举一反三的思考。

    2018-10-05
    7
    71
  • 王振华 程序员
    但是,如果我们要删除链表中的最后一个结点,前面的删除代码就不work了。 ``` if (head->next == null) { head = null } ``` 这里的head表示的是最后一个结点吗? “对于带头链表,插入头结点和插入其它节点,可以统一为相同的逻辑。”这我可以理解 但即使是带头链表,删除尾结点和删除其它节点,还是不能统一代码呀。 `p->next = p->next->next;` 无论是否是带头链表,对尾结点都没有影响呀。这行代码还是不能用于尾结点的删除呀?

    作者回复: 你理解错我的意思了。我说的最后一个结点的意思是:链表中只剩下一个结点。并不是指尾结点。

    2018-10-06
    16
    30
  • 鲫鱼
    快哭了,跨专业学习,就自学了一点python。都不知道要怎么去理解了😭 但是还是能理解一点的,慢慢坑了

    作者回复: 买本大话数据结构或者算法图解结合着看吧 这门课本身就比较难学 只能多花点时间了呢

    2018-10-09
    29
  • gogo
    c语言不熟悉 看起来有点吃力

    作者回复: 不好意思 我尽量写简单点 多加点注释

    2018-10-05
    23
  • 江谢木
    花了一个周末学链表,还是没学会写,是不是可以放弃了?

    作者回复: 看我后面有一篇加餐文章:羁绊你前行的不是肆虐的狂风 而是你内心的迷茫

    2019-09-30
    8
    21
  • hope
    看完了,打卡,稍后手写作业,去GitHub上看了下 ,希望老师把c的代码也添加上,谢谢

    作者回复: 要不你写下 提个pull request?

    2018-10-05
    20
  • 广进
    作为一个小白,每节课都有看不懂的,这次又来了,那个代码二,从while往下就不懂了,怎么感觉和一的功能不一样了。求指导。 还有您都觉得二可读性差了,加点注释照顾照顾我们这些小白呀。😭

    作者回复: 不好意思 我以后多加点注释 不过两段代码的功能是一样的

    2018-10-05
    2
    9
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部