当前位置: 首页 > news >正文

链表(下)—— 6个技巧教你写出正确的链表代码

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

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

p->next=q 表示 p 结点中的 next 指针存储了 q 结点的内存地址。从左到右读就可以,p 的下一个结点就是 q。

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

拿单链表的插入举例。在结点 a 和相邻的结点 b 之间插入 x,假设当前指针 p 指向结点 a。

p->next = x;  // 将 p 的 next 指针指向 x 结点;
x-next = p -> next;  // 将 x 的结点的 next 指针指向 b 结点;
复制代码

很显然,上面的代码执行结果有问题。结点 x 最终指向自己,这样链表就断开了,造成内存泄漏。所以应该颠倒一下顺序。

在插入结点时,一定要注意操作的顺序,这样才不会丢失指针。删除结点时,一定记得手动释放内存,以免产生内存泄漏。

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

针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理。比如判断是否为 null。

引入哨兵结点,不管链表是不是空,head 指针都会一直指向这个哨兵结点。把这种有哨兵结点的链表叫带头链表。相反。没有哨兵结点的链表就叫作不带头链表。

哨兵结点是不存储数据的。因为哨兵结点一直存在,所以插入第一个结点和插入其他结点,删除最后一个结点和删除其他结点,都可以使用相同的代码实现逻辑了。

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

常用来检查链表代码是否正确的边界条件:

  • 如果链表为空时,代码是否能正常工作?
  • 如果链表只包含一个结点时,代码是否能正常工作?
  • 如果链表只包含两个结点时,代码是否能正常工作?
  • 代码逻辑在处理头结点和尾结点的时候,是否能正常工作?

实际上,不光是写链表代码,在写任何代码时,也千万不要只实现业务正常情况下的功能,一定要多想想,代码在运行的时候,可能会遇到哪些边界情况或者异常情况。遇到了应该如何应对,这样写出来的代码才够健壮!

技巧五:举例画图,辅助思考

你可以找一个具体的例子,把它画在纸上,释放一些脑容量,留更多的给逻辑思考,这样就会感觉到思路清晰很多。

技巧六:多写多练,没有捷径

精选了 5 个常见的链表操作,作为练习的题目。

  • 单链表反转
  • 链表中环的检测
  • 两个有序的链表合并
  • 删除链表倒数第 n 个结点
  • 求链表的中间结点

转载于:https://juejin.im/post/5cc1a8b3e51d456e403772ef

相关文章:

  • 一份阿里P7的面试题
  • svn统计代码行数(增量)
  • O2OA V4.1660 发布,Java 全功能开源办公软件
  • 比特币公共api大全
  • ansible从入门到放弃
  • LeetCode每日一题: 移除元素(No.27)
  • 秒杀系统流量削峰这事儿应该怎么做?
  • jenkins测试配置
  • 20189317 《网络攻防技术》 第十周作业
  • SpringBoot RabbitMQ 集成 二 Work queues
  • 75条笑死人的知乎神回复,用60行代码就爬完了
  • Windows server 2012 利用ntdsutil工具实现AD角色转移及删除域控方法
  • Linux学习
  • 面试官:说说双亲委派模型?
  • 北京
  • SegmentFault for Android 3.0 发布
  • [译] React v16.8: 含有Hooks的版本
  • __proto__ 和 prototype的关系
  • 2017-09-12 前端日报
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Javascript弹出层-初探
  • overflow: hidden IE7无效
  • React16时代,该用什么姿势写 React ?
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SOFAMosn配置模型
  • spring security oauth2 password授权模式
  • spring学习第二天
  • uni-app项目数字滚动
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 聊聊flink的TableFactory
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 为什么要用IPython/Jupyter?
  • 新书推荐|Windows黑客编程技术详解
  • 学习笔记:对象,原型和继承(1)
  • 怎么把视频里的音乐提取出来
  • postgresql行列转换函数
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​低代码平台的核心价值与优势
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​用户画像从0到100的构建思路
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)(1.13) SiK无线电高级配置(五)
  • (11)MSP430F5529 定时器B
  • (2020)Java后端开发----(面试题和笔试题)
  • (ros//EnvironmentVariables)ros环境变量
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二十四)Flask之flask-session组件
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)kafka实战——kafka源码编译启动
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Oracle存储过程编写经验和优化措施
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别