如何写好链表代码?
- 理解指针或引用的含义
什么是指针?指针是一个变量
将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。
- 警惕指针丢失和内存泄漏
在插入和删除结点时,要注意先持有后面的结点再操作,否者一旦后面结点的前继指针被断开,就无法再访问,导致内存泄漏。
插入结点时,一定要注意操作的顺序
删除链表结点时,也一定要记得手动释放内存空间
- 利用哨兵简化难度
链表的插入、删除操作,需要对插入第一个结点和删除最后一个节点做特殊处理。利用哨兵对象可以不用边界判断,链表的哨兵对象是只存指针不存数据的头结点。
- 重点留意边界条件处理
操作链表时要考虑
如果链表为空时,代码是否能正常工作?
如果链表只包含一个结点时,代码是否能正常工作?
如果链表只包含两个结点时,代码是否能正常工作?
代码逻辑在处理头结点和尾结点的时候,是否能正常工作?
学习数据结构和算法主要是掌握一系列思想,能在其它的编码中也养成考虑边界的习惯。
- 举例画图,辅助思考
对于比较复杂的操作,可以用纸笔画一画,释放脑容量来做逻辑处理(时间换空间思想),也便于完成后的检查。
- 多写多练,没有捷径
孰能生巧,不管是什么算法,只有经过反复的练习,才能信手拈来。
哨兵对象思想,在 iOS AutoreleasePool 中有用到,在 AutoreleasePoolPush 时添加一个哨兵对象,Pop 时将到哨兵对象之间的所有 Autorelease 对象发送 release 消息。