146 LRUキャッシュ機構 面接の質問16.25。LRUキャッシュ
1 クラスLRUCache { 2 パブリック クラスDlinkNode { 3 プライベート int型のキー。 4 プライベート int型のval; 5 プライベートDlinkNode権; 6 プライベートDlinkNodeは左。 7 8 パブリックDlinkNode(){ 9 } 10 11 公衆 DlinkNode(int型のキー、int型の値){ 12 この .KEY = キー。 13 この .val = 値。 14 } 15 } 16 17 プライベートマップ<整数、DlinkNode>マップ= 新しい HashMapの<> (); 18 プライベート DlinkNodeヘッド= 新しい DlinkNode(-1、-1 ); 19 プライベート DlinkNodeテール= 新しい DlinkNode(-1、-1 ); 20 プライベート int型の容量; 21 22 公共 LRUCache(int型の容量){ 23 この .capacity = 容量。 24 head.right = 尾; 25 tail.left = ヘッド。 26 } 27 28 公共 int型のget(int型のキー){ 29 であれば(map.containsKey(キー)){ 30 DlinkNodeノード= map.get(キー)。 31 updateNode(ノード)。 // !!! 32 リターンmap.get(キー).val。 33 } 他{ 34 リターン -1 。 35 } 36 } 37 38 公共 ボイド PUT(INTキー、int型の値){ 39 もし(map.containsKey(キー)){ 40 DlinkNodeノード= map.get(キー)。 41 node.val = 値。 42 updateNode(ノード)。 // !!! 注意更新结点位置 43 } 他{ 44 であれば(map.size()== 容量){ 45 removeFromHead()。 46 } 47 DlinkNodeノード= 新しいDlinkNode(キー、値)。 48 addToTail(ノード)。 49 } 50 } 51 52 公共 ボイドremoveFromHead(){ 53 DlinkNodeデル= head.right。 54 map.remove(del.key)。 55 head.right = del.right。 56 del.right.left = ヘッド。 57 デル= NULL ; 58 } 59 60 公共 ボイドaddToTail(DlinkNodeノード){ 61 map.put(node.key、ノード)。 62 DlinkNode予備= tail.left。 63 pre.right = ノード。 64 node.left = プリ; 65 node.right = 尾。 66 tail.left =ノード。 // !!! 忘记这一句、调了一下午 67 } 68 69 公共 ボイドupdateNode(DlinkNodeノード){ 70 DlinkNode左= node.left。 71 DlinkNode右= node.right。 72 left.right = 右。 73 right.left =は、左; 74 addToTail(ノード)。 75 } 76 }
460 LFUキャッシュ