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

很汗颜,现在让自己完整的写出一个简单的链表结构竟然会无法动笔,作为一个程序猿,需要修行的路还很长。

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

将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

例子: p->next = q。这行代码的意思是p节点的next指针存储了q节点的内存地址。

同理, p->next = p->next->next。这行代码的意思是p节点的next指针存储了p节点的下下一个节点的地址。

技巧二:警惕指针丢失和内存泄漏

举例插入节点:

如图所示,我们希望在节点a和b之间插入节点x,假设当前指针p指向节点a。如果代码如下就会发生指针丢失和内存泄漏。

p->next = x;
x->next = p->next; 

此处在p->next执行之后,其指针就不再指向b了,而是指向x。第二行代码就相当于自己指向了自己。因此,链表断成了两半,从节点b往后的所有界定啊都无法访问。

正确方式:将第一行代码和第二行代码颠倒顺序,就ok了。

技巧三:利用哨兵简化实现难度

如下,节点p之后插入节点的正确代码。

x->next = p->next;
p->next = x;

注意:当需要向一个空链表中插入第一个节点,上面的逻辑就不能用了。正确答案如下:

if(head==null){
    head = new_node;
}

同理,在编写链表的删除操作之时,分为两种情况:

第一种,删除节点不是尾节点,而是p节点的后继结点

p->next = p->next->next;

第二种,删除结点是尾结点

if(node->next == null){
   head = null;
}

技巧四:重点留意边界条件处理

如果链表为空,代码能否正常工作?

如果链表只包含一个结点时,代码是否能正常工作?

如果链表只包含两个结点时,代码是否能正常工作?

代码逻辑在处理头结点和尾节点的时候,是否能正常工作?

技巧五:自己画图,辅助记忆

常见的链表操作:

一、单链表反转

二、链表中环的检测

三、两个有序的链表的合并

四、删除链表倒数第n个结点

五、求链表的中间结点

分别对应LeetCode练习题编号:206,141,21,19,876。

课后思考:你是否能想到其他场景,利用哨兵可以大大简化编码难度?

后续把自己实现的五种链表操作传上来。欢迎指正!

原文地址:https://www.cnblogs.com/CherishZeng/p/9787165.html

时间: 2024-10-12 20:50:12

7、链表(下):如何轻松写出正确的链表代码?的相关文章

如何写出优雅的CSS代码 ?(转)

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

【知识点】如何写出优雅的CSS代码 ?

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

如何写出优雅的css代码?

如何写出优雅的css代码? 对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来井井有条,清晰易懂,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如

如何写出没有BUG的代码?

1947年9月9日,美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作.她的团队跟踪到 Mark II 上的一个错误,操作人员发现是由于一只飞蛾钻到了 Mark II 的继电器里导致的.团队清除了这只飞蛾,一切恢复正常.当时的工作人员记录了这样一句日志:" First actual case of bug being found. "  这次著名的事件,犹如潘多拉打开了魔盒,从此,程序员的世界里,bug 满天飞

【整洁之道】如何写出更整洁的代码(上)

如何写出更整洁的代码 代码整洁之道不是银弹,不会立竿见影的带来收益. 没有任何犀利的武功招式,只有一些我个人异常推崇的代码整洁之道的内功心法.它不会直接有效的提高你写代码的能力与速度,但是对于程序员的整个职业生涯必然会带来意想不到的好处. 如果你还是一个在校学生,或者是刚工作没多久的"菜鸟",那么很有必要接触一些这方面的知识的.很显然,它会帮助你更快的适应企业级开发的要求. 1. 为什么需要代码更整洁? 在考虑代码整洁的时候,我们需要明确的一个前提是,这里不讨论代码的对错. 关于什么是

幸福村站——成都传智播客程序员写出你的烧烤代码

又是一个阳光明媚,风和日丽之天,如果作为程序员的你还在键盘上苦苦的想着下一串代码该怎么写的话,那你就弱爆了.俗语说得好,学习要劳逸结合,写代码更是需要清晰的思维,在传智播客Java基础班开班一个月后,班主任决定带着这群"猿猴们"去传说中的"幸福村"放松放松,我们也跟着一起去感受程序员们的烧烤代码的幸福吧! 带着好奇的心理走进了"幸福梅林站",一个又一个的农家乐园开始浮现在我们眼前,那里朴素的民风和美丽的风景让我们暂时忘却了学习上的烦恼和城市里的喧

掌握解决问题的艺术,学会迭代开发,成为协作开发的专家,然后为写出更好的代码而担忧(转)

很多开发人员普遍犯有一个错误,认为他们的工作就是写代码.这不是一个开发人员要做的事情. 一个开发人员的工作是解决问题. 解决问题的一部分过程通常涉及到写代码,但是这部分工作是非常非常小的.开发有用的东西才花更多时间. 明白如何迭代开发,随着对问题有更好的理解,你才能给难题增加一些小功能,因为从头开发完美的产品是不可能的.不用写代码就能验证功能,因为很明显,写代码是相当昂贵的. 用于测试.评测和抛弃想法的系统也是极其重要的,因为要是没有它,整个开发组将耗费越来越多的精力,还有用来帮助他们执行得更有

关于单元测试,如何写出可测试的代码?

单元测试在一个完整的软件开发流程中是必不可少的.非常重要的一个环节.通常写单元测试并不难,但有的时候,有的代码和功能难以测试,导致写起测试来困难重重.因此,写出良好的可测试的(testable)代码是非常重要的.接下来,我们简要地讨论一下什么样的代码是难以测试的,我们应该如何避免写出难以测试的代码,以及要写出可测试性强的代码的一些最佳实践. 什么是单元测试(unit test)? 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进

怎样写出工业级的C代码 (2)

怎样写出工业级的C代码 1. 层次分明:结构清晰 ,模块划分 2.重要tips a.从词法的角度来看, 熟悉C运算符号的优先级,特别是不能混淆=/&&/+-和移位等操作符之间的顺序: 常见容易混淆的顺序包括: 算术加减和移位操作:a>>b+1表示a>>(b+1),而非(a>>b) + 1: 自加/减和->/.运算符号:a->b.c; ++a->b 理解编译器对符号解析处理的过程:比如a+++b,到底是a++ +b还是a+ ++b: if