LinkedList增刪改查鏈表算法。
LRU算法:
1、插入數據到頭節點
2、訪問數據命中。則將數據移到頭部。
3、鏈表滿 的時候,刪除尾部節點。
public class LinkedList<T> {
Node nodelist;
int size;
public LinkedList(){
size=0;
}
//插入節點到頭部
public void put(T data){
Node cur=new Node(data,nodelist);//新創建的節點next指向node
nodelist=cur;//node重新指向頭部
size++;
}
public void put(int index,T data){
checkPositionIndex(index);
Node cur=nodelist;//創建節點cur 等於頭集結點node
Node head=nodelist;
for(int i=0;i<index;i++){
head=cur;
cur=cur.next;
}
Node node=new Node(data,cur);
head.next=node;
size++;
}
public void checkPositionIndex(int index) {
if(!(index>=0&&index<=size)){//index不合法
throw new IndexOutOfBoundsException("inedx: "+index+", size: "+size);
}
}
//刪除節點 頭節點
public T remove(){
if(nodelist!=null){
Node node=nodelist;
nodelist=nodelist.next;
node.next=null;//gc
size--;
return node.data;
}else{
return null;
}
}
//刪除指定位置
public T remove(int index){
checkPositionIndex(index);
Node head=nodelist;
Node cur=nodelist;
for(int i=0;i<index;i++){
head=cur;
cur=cur.next;
}
//刪除cur節點
head.next=cur.next;
cur.next=null;
size--;
return cur.data;
}
//刪除尾部節點
public T removeLast(){
if(nodelist!=null){
Node node=nodelist;
Node cur=nodelist;
while(cur.next!=null){
node=cur;
cur=cur.next;
}
node.next=null;
size--;
return cur.data;
}else{
return null;
}
}
//修改節點
public void set(int index,T newData){
Node node=nodelist;
for(int i=0;i<index;i++){
node=node.next;
}
node.data=newData;
}
//查詢節點 頭部節點
public T get(){
Node node=nodelist;
if(node!=null){
return node.data;
}else{
return null;
}
}
public class LruLinkedList<T> extends LinkedList<T> {
int memory_size;
public LruLinkedList(int size){
memory_size=size;
}
//LRU添加節點
public void Lruput(T data){
if(size>=memory_size){//刪除尾部節點在插入
removeLast();
put(data);
}else{
put(data);
}
}
//刪除尾部節點
public T Lruremove(){
return removeLast();
}
//LRU訪問 訪問數據插入頭部,若鏈表滿則刪除尾部節點
public T Lruget(int index){
checkPositionIndex(index);
Node pre=nodelist;
Node cur=nodelist;
for(int i=0;i<index;i++){
pre=cur;
cur=cur.next;
}
T data=cur.data;
pre.next=cur.next;
Node head=nodelist;
cur.next=head;
nodelist=cur;
return data;
}
public static void main(String[] args) {
LruLinkedList<String> lrulist=new LruLinkedList<String>(8);
for (int i=0;i<7;i++){
lrulist.Lruput("name"+i);
}
lrulist.toString();
lrulist.Lruget(1);
lrulist.toString();
lrulist.Lruput("3");
lrulist.toString();
lrulist.Lruget(7);
lrulist.toString();
lrulist.Lruput("9");
lrulist.toString();
}
}