数据结构-链表

链表

单链表

  • 结构:-->data|next-->data|next-->null
  • 你应该能够发现,其中有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。咱们习惯性地把第一个结点叫做头结点,把最 后一个结点叫做尾结点。其中,头结点用来记录链表的基地址。有了它,咱们就能够遍历获得整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而 是指向一个空地址NULL,表示这是链表上最后一个结点

循环链表

  • 循环链表的尾节点指针是指向链表的头结点。
  • image.png

循环链表的优势是从链尾到链头比较方便。当要处理的数据具备环型结构特色时,就特别适合采用循环链表。好比著名的约瑟夫问题。尽管用单 链表也能够实现,可是用循环链表实现的话,代码就会简洁不少算法

双向链表

  • 须要额外的两个空间来存储后继及诶单和前驱节点的地址,比单链占用更多内存,但能够支持双向遍历
  • image.png
  • 对于删除节点中"值等于某个给定值"的结点,两种方式都差很少
  • 对于删除给定指针指向的结点,因为双向链表记录了前驱结点的指针,不须要像单链表同样遍历
  • 查询效率也比通常的链表快,平均只须要查找一半的数据
  • JAVA中的LinkedHashMap

双向循环链表

  • image.png

基于链表实现LRU缓存淘汰算法

  • 维护一格有序单链表,越靠近尾部数据越早。当有一个新的数据被访问时,咱们从链表头开始顺序遍历链表。数组

  • 1.若是此数据以前已经被缓存在链表中了,咱们遍历获得这个数据对应的结点,并将其从原来的位置删除,而后再插入到链表的头部。缓存

  • 2.若是此数据没有在缓存链表中,又能够分为两种状况:优化

若是此时缓存未满,则将此结点直接插入到链表的头部;    若是此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的头部。指针

  • 优化:引入散列表来记录每一个数据的位置。

基于数组实现LRU缓存淘汰策略

  • 方式一:首位置保存最新访问数据,末尾位置优先清理
  • 方式二:首位置优先清理,末尾位置保存最新访问数据(优化:清理的时候能够考虑一次性清理必定数量,减小清理次数)
相关文章
相关标签/搜索