本文是学习链表一章的学习笔记,简单画了画重点,写的十分粗糙,仅供大家参考,如有错误/建议/补充,欢迎留言讨论,共同进步。书的链接放在文末。需要书籍的请私戳。
-
可以在常数时间内扩展
常见的链表
- 单向链表
- 双向链表
- 循环链表
双向链表主要优点
双向链表主要缺点
循环链表的特点
其他链表
- 一种存储高效的双向链表:
- 只需要一个指针,指针的字段是后继结点和前驱结点的地址的差
- 松散链表
- 单向链表分成多个块,每个块内部呈现循环链表状
链表的算法题常见类型
- 找到链表的倒数第n个结点(双指针法)
- 环的判定(理解环的数学性质,利用快慢指针法)
- 是否存在环
- 判定环的形状
- 判定环的起点
- 求出环的长度
- 插入结点
- 逆置链表
- 找出相交链表的合并点(散列表、栈、数组、双指针都可以)
- 找到链表的中间结点(快慢指针)
- 判定链表长度的奇偶(快慢指针)
- 合并链表(递归)
- 二叉树转换为双向链表
- 逐对逆置链表(递归/迭代,指向的转换要理清楚)
- 连接两个链表使用循环链表,时间复杂度最低O(1)
- 判定链表是否回文(栈/逆置后半部分)
- 交换相邻结点(循环部分不好写,多看几遍示例)
- 逆置节点中包含K个结点的块(交换结点的扩展)
- 利用散列表可以实现存取链表元素的复杂度为O(1),用到分摊分析
- 约瑟夫环问题
- 复制这种链表:每个结点包含数据、下一个指针和指向链表中随机一个结点的指针。(用散列表保存链表信息,再用散列表的信息完成复制)
- 寻找模结点(把数学问题搞清楚,然后按部就班写)
- 从表尾开始寻找模结点
- 找分散结点
学代码要经常总结,分享交流,努力养成这些好习惯吧~