前述
链表代码不好写,初学者经常容易出错。掌握以下几个规则,可能可以提高编写链表的技术。
一共 6 个技巧:
1. 理解指针或引用的含义
对一个引用进行赋值,其实就是将这个变量的地址保存到这个引用中。
例如 int a = "100",就是将 “100” 的实际地址,保存到了 a 的引用中。
2 警惕指针丢失
下面有一段链表插入的代码
a.next = x; // 将 a 的 next 指向 x。
x.next = a.next; // 将 x 的 next 指向 b。
这段代码实际上发生了错误。即所谓的指针丢失,如果这么写,那么 b 节点就会丢失。
而要修复这个 bug,只需将上下代码调换顺序即可。
3 利用哨兵简化实现难度
传统链表,当新增数据时,需要做以下判断:
if(head == null){
head = new LinkedNode(x);
}
当删除数据时,也需要做判断:
if(head.next == null){
head = null;
}
如果将 head 做为虚拟节点,那么就不用做这些判断,就可以提高代码的美感。
如下图:
4 重点留意边界处理
写完链表代码时,可以思考以下几个问题,来验证代码是否正确。
- 如果链表是空,代码有无 bug?
- 如果链表只有一个节点,代码有无 bug?
- 如果链表只有 2 个节点,代码有无 bug?
- 代码处理 head 和 tail 时,有无 bug?
5 举例画图,辅助思考
简单说,就是多画图。减轻大脑压力。
6. 最后,多写多练 ,没有捷径
leetcode 刷起来!!!!
下面是 5 个常见题目,熟练这 5 个题目,链表也就熟练了:
- 单链表反转
- 链表中环的检测
- 两个有序的链表合并
- 删除链表中倒数第 n 个节点
- 求链表的中间节点
小结
写链表是最考验逻辑思维能力的。链表代码到处都是指针操作,边界处理。一不小心就会采坑。这需要很多的练习和缜密的思考才能写出 bug free 的代码。