LinkedList鏈表算法,實現LRU緩存淘汰算法

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();
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章