如何优雅的写出链表代码

理解指针或引用的含义

含义:

  将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值给指针(引用)。

示例:

  p—>next = q; 表示p节点的后继指针存储了q节点的内存地址。
  p—>next = p—>next—>next; 表示p节点的后继指针存储了p节点的下下个节点的内存地址。

警惕指针丢失和内存泄漏(单链表)

1.插入节点

  在节点a和节点b之间插入节点x,b是a的下一节点,,p指针指向节点a,则造成指针丢失和内存泄漏的代码:p—>next = x;x—>next = p—>next; 显然这会导致x节点的后继指针指向自身。
  正确的写法是2句代码交换顺序,即:x—>next = p—>next; p—>next = x;

2.删除节点

  在节点a和节点b之间删除节点b,b是a的下一节点,p指针指向节点a:p—>next = p—>next—>next;

利用“哨兵”简化实现难度

1.什么是“哨兵”?

  链表中的“哨兵”节点是解决边界问题的,不参与业务逻辑。如果我们引入“哨兵”节点,则不管链表是否为空,head指针都会指向这个“哨兵”节点。我们把这种有“哨兵”节点的链表称为带头链表,相反,没有“哨兵”节点的链表就称为不带头链表。

2.未引入“哨兵”的情况

如果在p节点后插入一个节点,只需2行代码即可搞定:
new_node—>next = p—>next;
p—>next = new_node;
但,若向空链表中插入一个节点,则代码如下:
if(head == null){
  head = new_node;
}
如果要删除节点p的后继节点,只需1行代码即可搞定:
p—>next = p—>next—>next;
但,若是删除链表的最有一个节点(链表中只剩下这个节点),则代码如下:
if(head—>next == null){
  head = null;
}
从上面的情况可以看出,针对链表的插入、删除操作,需要对插入第一个节点和删除最后一个节点的情况进行特殊处理。

这样代码就会显得很繁琐,所以引入“哨兵”节点来解决这个问题。

3.引入“哨兵”的情况

“哨兵”节点不存储数据,无论链表是否为空,head指针都会指向它,作为链表的头结点始终存在。这样,插入第一个节点和插入其他节点,删除最后一个节点和删除其他节点都可以统一为相同的代码实现逻辑了。

4.“哨兵”还有哪些应用场景?

1.

2. 如扫雷游戏

每次点击一个格子就要扫描相邻的8个格子。当点击到边界的时候,相邻不足8个格子,这时候就可以在设计游戏的时候为边界外圈加上隐藏的一层格子。这样就可以使所有的操作一致化,不需要对边界的条件作出特殊的处理。

总结:
1 ) 哨兵基本不能降低数据结构相关操作的渐近时间界,但其可以降低常数因子。
2 ) 哨兵的设计可以使得代码更简洁,可以省去一些由于边界环境不同而作出的特殊处理。
3 ) 在某些情况下哨兵可以使得循环语句更紧凑,降低运行时间里n或者n²项的系数。
4 ) 慎用:哨兵会占用额外的内存。当使用哨兵的开销较大时,有可能会造成严重的浪费

重点留意边界条件处理

经常用来检查链表是否正确的边界4个边界条件:
1.如果链表为空时,代码是否能正常工作?
2.如果链表只包含一个节点时,代码是否能正常工作?
3.如果链表只包含两个节点时,代码是否能正常工作?
4.代码逻辑在处理头尾节点时是否能正常工作?

举例画图,辅助思考

核心思想:释放脑容量,留更多的给逻辑思考,这样就会感觉到思路清晰很多。

多写多练,没有捷径

5个常见的链表操作:
1.单链表反转
2.链表中环的检测
3.两个有序链表合并
4.删除链表倒数第n个节点
5.求链表的中间节点

原文地址:https://www.cnblogs.com/mysky007/p/12323033.html

时间: 2024-10-11 13:34:12

如何优雅的写出链表代码的相关文章

代码规范、如何写出好代码

代码规范.如何写出好代码 作为一个程序员,肯定希望能写出一手好代码,看起来赏心悦目,又易于理解.既方便日后自己回来翻阅一眼就能明白代码在干什么,又能让接手的人很快上手,看到精妙的地方,不由自主地发出由衷的感叹,悄无声息地改变别人不好的习惯. 如何才能写出好代码呢?在一次讲座上,我听了一位编程大神的看法,在这里分享给大家. 好的代码应该至少具备下面这6个特点: 使用空行来分割逻辑 使用注释和花括号 不用的代码和引用删除 不要用中文拼音做变量名 可用,清晰优雅,高效 多写代码,多思考 使用空行来分割

写出优美代码的方式,两个习惯:一步到位VS迭代优化

最近把手头这个安卓APP的所有事务性方法都写完了,有了以下体会,新手体会,老鸟轻拍 想写成优美代码的人一般都会有这样的想法: 一定要在写每一句代码,写每一个方法,构造每一个类的时候,都要记得优化:解耦以复用,拆分方法以复用,使用循环减少冗余,限制循环次数减少无效操作,等等.. 这个想法一定没有错,但很多时候往往会是这样的情况: 当功能一复杂,比如你已经分解了几个方法,比如你已经使用了几层循环(有点过分...),比如在多线程中 你经常无法一步到位地完成那么多优化 这往往造成你写一句代码会思考很久

导致程序员写出烂代码的35个恶习,看看你染上了几个?

IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员,最新的研究表明确实存在这样一小撮效率奇高的"程序金刚",但是一位普通程序猿如何能够蜕变成代码金刚呢? 国内外的各大专家总结了导致程序猿效率低下,代码为什么像坨shi一,样难以维护的35条恶习(归为代码组织.团队工作.写代码.测试与维护四大类). 代码组织 1.总是说"一会弄好",但从来不兑现.(缺乏任务管理和时间管理能力) 2.坚持所谓的高效.优雅的"一行代码流",事实上,可读性才是最重

如何优雅的写一个分页代码(三)

此分页的步骤完全是按照:见我的博客点击打开链接,这个图的步骤来写分页的 1.写PageBean类,见我的博客点击打开链接 2.写Action类,将jsp中需要的类放到指定的作用域中,这里我放到了值栈中,因为这样就可以直接使用属性了. /*显示单个列表*/ public String show(){ //准备数据forum Forum forum=forumService.getById(model.getId()); ActionContext.getContext().put("forum&q

你还用拼音为变量命名?新人OIer别傻了,教你写出优质代码

本篇文章适用语言:python,c++,Java.(其实我就是随便bb) 我们在编辑代码的时候,不免拿其他人的代码进行学习,或者将自己的代码拿给别人修改.这个时候,如何让别人快速读懂你的代码,是提升效率的关键,而且一个好的码风可以让自己读起来也赏心悦目.那么接下来我就会对这一部分进行讲解. 变量命名 我将码风分为两个部分,变量命名和代码书写. 变量命名当中,最最最最恶心的一点就是拿拼音来为变量命名,你拿x,y,z都好过.什么书本的数量用"shuben",你是小学没学过吗?我幼儿园都会&

finally中调用unlockWrite对写出健壮代码是很重要的

一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询 外键:有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工 如果某个线程想要读取资源,只要没有线程正在对该资源进行写操作且没有线程请求对该资源的写操作即可.我们假设对写

理解SQL原理,写出高效代码

做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗?(顺便打一下广告,我们也做ERP,欢迎联系咨询) 要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行sql语句的,很多人会看执行计划,或者用profile来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序.平时大家多

? 按照所给的程序流程图,写出Java代码(用类和方法实现)

代码为:package com.lwk.test2; 主类: import java.util.Scanner; package com.lwk.test2; public class Demo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test test = new Test(); test.test(); } } 方法类: package

写出以下代码运行结果(包括单击事件的输出)

1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <script> 9 function CreateDiv(){ 10 this.m_Text='Hi,welcome'; 1