基本概念
-
链表的操作:链表反转、有序链表合并等\
-
学习的方法:多练+多总结
技巧一:理解指针或引用的含义
-
语言中的指针
- c语言的指针
- Java的引用
-
什么是指针
- 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针
- 指针指向变量地址(000ffff)
- 通过指针可以找到变量(int(001ffff-000ffff))
-
举个例子
-
p→next=q:p 结点中的 next 指针存储了 q 结点的内存地址\
-
p->next=p->next->next:p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址
-
技巧二:警惕指针丢失和内存泄漏
-
什么情况会指针丢失
-
删除操作是否,操作指针的顺序错误,会导致指针循环\
-
对于c语言需要手动释放内存\
-
\
技巧三:利用哨兵简化实现难度
-
为什么是哨兵
- 大部分的链表操作都可以利用
- 针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理\
-
有哨兵的是带头链表
-
可能用到的地方:插入排序、归并排序、动态规划\
\
技巧四:重点留意边界条件处理
-
检查链表的边界
-
如果链表为空时,代码是否能正常工作?\
-
如果链表只包含一个结点时,代码是否能正常工作?\
-
如果链表只包含两个结点时,代码是否能正常工作?\
-
代码逻辑在处理头结点和尾结点的时候,是否能正常工作?
-
技巧五:举例画图,辅助思考
- 举例法和画图法\
\
技巧六:多写多练,没有捷径
- 单链表反转
- 链表中环的检测
- 两个有序的链表合并
- 删除链表倒数第 n 个结点 双指针(判断边界问题,哨兵、、、)
- 求链表的中间结点 双指针\
总结
-
链表的正确使用方式
-
理解指针或引用的含义\
-
警惕指针丢失\
-
内存泄漏\
-
利用哨兵简化实现难度\
-
重点留意边界条件处理\
-
-
写链表代码是最考验逻辑思维能力的