先給乙個節點類,屬性有:節點值(我用的int型別數值為例),前節點,後節點。前節點主要功能是便於不用遍歷的方式尋找前節點,以免多次遍歷造成時間複雜度的增長。
public
class
node
提供乙個構造方法,去建立煉表頭
public
node
(int value)
提供兩種add方式,方便不同的情況插入
public node add
(int value)
//對於直接插入節點,要注意前後節點的更改
public node add
(node node)
重寫tostring方法,方便檢視節點值
@override
public string tostring()
return value+
"-->"
+this
.next.
tostring()
;}
開始寫lru(最大快取區為100)
class
lru//尋找尾節點的方法,從已有尾節點開始往後尋找
void
lastnode()
lastnode= node;
}//檢查值為value的節點值是否存在
node valuecheck
(int value)
x = x.next;
}while
(x != null)
;return null;
}//新增操作,
//遍歷鍊錶,判斷待新增的資料時候已經存在
//存在: 刪除該節點,然後在頭節點新增。
//不存在:
// 1. 快取沒滿:在頭節點新增
// 2. 快取滿了,刪除最後乙個節點,然後在頭節點新增
void
add(
int value)
else
//判斷是否超出快取大小
if(size >= sizemax)
//因為是頭節點新增所以是valuecheck新增node,再將valuecheck賦值給node,
//並將頭節點的前節點置為null
valuecheck.
add(
this
.node)
;this
.node = valuecheck;
this
.node.pre = null;
//最後將size+1
this
.size++;}
//刪除節點,因為該方法是類體自己呼叫的,所以不需要判斷是否存在(因為只有存在才呼叫)
private
void
delete
(node node)
if(node.pre == null)
else
if(node.next == null)
//如果是中間節點的話,就正常斷前後鏈
//刪除某個節點值為value的節點
void
delete
(int value)
//存在的的話就刪除
delete
(valuecheck);}
//尋找某個節點值為value的節點
void
find
(int value)
}//重寫tostring方法,直接用node寫好的tostring就可以
@override
public string tostring()
}
基本基於雙鏈表的lru就是實現了,主要就是對lru的認識,lru就是把最近用的放到最前面,最不常用的放在最後,等到因為快取慢需要刪除的時候,優先刪除最後乙個節點。 雙鏈表實現LRU
題目 lru 快取機制 設計和實現乙個 lru 最近最少使用 快取資料結構,使它應該支援一下操作 get 和 put。get key 如果 key 存在於快取中,則獲取 key 的 value 總是正數 否則返回 1。put key,value 如果 key 不存在,請設定或插入 value。當快取...
基於雙鏈表 hashtable實現的LRU演算法
實現原理 將cache的所有位置都用雙連表連線起來,當乙個位置被命中之後,就將通過調整鍊錶的指向,將該位置調整到煉表頭的位置,新加入的cache直接加到煉表頭中。這樣,在多次進行cache操作後,最近被命中的,就會被向煉表頭方向移動,而沒有命中的,而想鍊錶後面移動,鍊錶尾則表示最近最少使用的cach...
雙鏈表的簡單實現
include include include typedef int elemtype using namespace std typedef struct dulnode dulnode,dulinklist 建立帶有頭結點的雙鏈表,順序輸入 void createdulist dl dulin...