首先,我们维护一个有序的单链表结构,链表的尾端结点是越早之前访问过的。当有一个新的数据被访问时,我们从链表的开头顺序遍历链表。
1.如果该数据之前已经缓存在链表中,我们将其从原来的位置删除,并把它存储插到链表的头部。
2.如果不在链表中又可以分为两种情况:
如果此时缓存的链表未满,将其直接插入到链表的头部。
如果此时缓存已满,将链表尾部的节点删除,并将新的链表节点插入到链表的头部。
基于链表实现的LRU,缓存访问的时间复杂度为O(n);另外,我们可以用散列表来记录每个数据的位置,将缓存访问的时间复杂度降到O(1)。