链表
单链表
- 结构:-->data|next-->data|next-->null
- 你应该能够发现,其中有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。咱们习惯性地把第一个结点叫做头结点,把最 后一个结点叫做尾结点。其中,头结点用来记录链表的基地址。有了它,咱们就能够遍历获得整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而 是指向一个空地址NULL,表示这是链表上最后一个结点
循环链表
- 循环链表的尾节点指针是指向链表的头结点。
-
循环链表的优势是从链尾到链头比较方便。当要处理的数据具备环型结构特色时,就特别适合采用循环链表。好比著名的约瑟夫问题。尽管用单 链表也能够实现,可是用循环链表实现的话,代码就会简洁不少算法
双向链表
- 须要额外的两个空间来存储后继及诶单和前驱节点的地址,比单链占用更多内存,但能够支持双向遍历
-
- 对于删除节点中"值等于某个给定值"的结点,两种方式都差很少
- 对于删除给定指针指向的结点,因为双向链表记录了前驱结点的指针,不须要像单链表同样遍历
- 查询效率也比通常的链表快,平均只须要查找一半的数据
- JAVA中的LinkedHashMap
双向循环链表
基于链表实现LRU缓存淘汰算法
-
维护一格有序单链表,越靠近尾部数据越早。当有一个新的数据被访问时,咱们从链表头开始顺序遍历链表。数组
-
1.若是此数据以前已经被缓存在链表中了,咱们遍历获得这个数据对应的结点,并将其从原来的位置删除,而后再插入到链表的头部。缓存
-
2.若是此数据没有在缓存链表中,又能够分为两种状况:优化
若是此时缓存未满,则将此结点直接插入到链表的头部; 若是此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。指针
基于数组实现LRU缓存淘汰策略
- 方式一:首位置保存最新访问数据,末尾位置优先清理
- 方式二:首位置优先清理,末尾位置保存最新访问数据(优化:清理的时候能够考虑一次性清理必定数量,减小清理次数)