/**
* 通过单向链表实现LRU
*/
public class LRUTest {
public static void main(String[] args) {
LRUCirLinkList lruCirLinkList = new LRUCirLinkList();
lruCirLinkList.insertValue("1");
lruCirLinkList.insertValue("2");
lruCirLinkList.insertValue("3");
lruCirLinkList.insertValue("4");
lruCirLinkList.insertValue("5");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("3");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("4");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("5");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("6");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("7");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("8");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("9");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("3");
System.out.println(lruCirLinkList.toString());
lruCirLinkList.insertValue("5");
System.out.println(lruCirLinkList.toString());
}
}
/**
* 单向链表,此单向链表里的值不重复
*/
class LRUCirLinkList {
static private OneWayCirNode head = null;
private int length = 0;
private final int FIXLENGHT = 7;
/**
* 查询是否包含值为value的节点,如果存在,则将该节点移动为头节点,如果不存在,则插入为头节点
* @param value
*/
public void insertValue(String value){
// 用来判断是否和头节点值相同,如果相同则返回
if(head != null && head.value != null && head.value.equals(value)){
return;
}
OneWayCirNode valueNode;
if (head != null && head.nextNode != null){
OneWayCirNode cur = head;
while(cur.nextNode != null){
if (value.equals(cur.nextNode.value)){
// 将原本值所在的位置删除
cur.nextNode = cur.nextNode.nextNode;
length --;
break;
}
cur = cur.nextNode;
}
}
// 则将节点插入头部
// 判断现有长度
if (length >= FIXLENGHT){
// 如果已经等于了链表的固定长度,删除尾节点
this.deleteTail();
}
valueNode = new OneWayCirNode(value);
valueNode.nextNode = head;
head = valueNode;
length ++;
}
/**
* 删除最后一个节点
*/
public void deleteTail(){
if (head != null && head.nextNode != null){
OneWayCirNode cur = head;
OneWayCirNode nextNode;
while (cur.nextNode != null){
nextNode = cur.nextNode;
// 遍历得到了最后的尾节点
if(nextNode.nextNode == null) {
cur.nextNode = null;
break;
}
cur = nextNode;
}
} else if (head != null){
// 原本就只有头节点
head = null;
}
length --;
}
@Override
public String toString(){
StringBuffer strBuffer = new StringBuffer();
if (head != null){
OneWayCirNode cur = head;
while (cur.nextNode != null){
strBuffer.append(cur.value).append(",");
cur = cur.nextNode;
}
// 最后一个元素
if (cur.nextNode == null){
strBuffer.append(cur.value);
}
return strBuffer.toString();
} else {
return "Empty LinkList";
}
}
}
/**
* 单向链表节点
*/
class OneWayCirNode{
String value = null;
OneWayCirNode nextNode = null;
public OneWayCirNode(String value) {
this.value = value;
this.nextNode = null;
}
}
结果:
5,4,3,2,1
3,5,4,2,1
4,3,5,2,1
5,4,3,2,1
6,5,4,3,2,1
7,6,5,4,3,2,1
8,7,6,5,4,3,2
9,8,7,6,5,4,3
3,9,8,7,6,5,4
5,3,9,8,7,6,4