本文介绍几个写链表代码技巧
1. 理解指针或引用的含义
将某个变量(对象)赋值给指针(引用), 实际上就是将这个变量(对象)的地址赋值给指针(引用),也可以反过来说,指针(yiny)中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。比如:
- p->next = q, 意思是p结点中的next指针存储了q结点的内存地址。
- p->next = p->next->next表示p结点的next指针存储了p结点的下下一个结点的内存地址
2. 警惕指针丢失和内存泄漏
在写链表的时候,一定要
3.利用哨兵简化实现难度
- 什么是“哨兵”?
链表中的“哨兵”结点是解决边界问题的,不参与业务逻辑,如果我们引用“哨兵”结点,则不管链表是否为空,head指针都是指向这个"哨兵"结点,我们把这种有“哨兵”结点的链表成为带头链表,相反,如果没有“哨兵”结点就称为不带头链表
2.在链表中引入“哨兵”
“哨兵”节点不存储数据,无论链表是否为空,head指针都会指向它,作为链表的头结点始终存在。这样,插入第一个节点和插入其他节点,删除最后一个节点和删除其他节点都可以统一为相同的代码实现逻辑了。 - 哨兵的应用
暂时就自己知道的,貌似有的排序的算法也可以利用(后面去详细了解一下!)
4.重点留意边界条件处理
在完成链表代码后,可以用一下几个边界条件检查代码是否正确:
- 如果链表为空时,代码是否能正常工作。
- 如果链表只包含一个结点时,代码是否能正常工作。
- 如果链表只包含两个结点时,代码是否能正常工作。
- 代码逻辑在处理头结点和尾结点的时候,是否能正常工作。
除此之外,针对不同的场景,可能还有特定的边界条件,这个需要自己去思考,实际上, 不光是写链表,写任何代码,一定要多想想,你的代码在运行的时候,可能会遇到哪些边界情况或者异常情况。遇到了应该如何应对,这个写出来的代码才够健壮。
5.举例画图,辅助思考
6.多写多练,没有捷径
- 5个常见的链表操作
- 单链表反转
- 链表中环的检测
- 两个有序链表的合并
- 删除链表倒数第n个结点
- 求链表的中间结点
很多链表在逻辑上并没有什么复杂的,最重要的还是能够用代码bug free的实现出来,多写多练。