File tree Expand file tree Collapse file tree 1 file changed +82
-0
lines changed Expand file tree Collapse file tree 1 file changed +82
-0
lines changed Original file line number Diff line number Diff line change 1+ class LRUCache {
2+ private class Node {
3+ private int key , value ;
4+ private Node next , prev ;
5+
6+ public Node () {
7+ key = 0 ;
8+ value = 0 ;
9+ }
10+
11+ public Node (int k , int v ) {
12+ key = k ;
13+ value = v ;
14+ }
15+ }
16+
17+ private int capacity , currSize ;
18+ private Node head , tail ;
19+ private Map <Integer , Node > map ;
20+
21+ public LRUCache (int capacity ) {
22+ this .capacity = capacity ;
23+ currSize = 0 ;
24+ map = new HashMap <>();
25+ head = new Node ();
26+ tail = new Node ();
27+ head .next = tail ;
28+ tail .prev = head ;
29+ }
30+
31+ public int get (int key ) {
32+ if (!map .containsKey (key )) {
33+ return -1 ;
34+ }
35+
36+ Node n = map .get (key );
37+ update (n );
38+ return n .value ;
39+ }
40+
41+ public void put (int key , int value ) {
42+ Node n = map .get (key );
43+
44+ if (n == null ) {
45+ n = new Node (key , value );
46+ map .put (key , n );
47+ add (n );
48+ ++currSize ;
49+ } else {
50+ n .value = value ;
51+ map .put (key , n );
52+ update (n );
53+ }
54+
55+ if (currSize > capacity ) {
56+ Node toDelete = tail .prev ;
57+ remove (toDelete );
58+ map .remove (toDelete .key );
59+ --currSize ;
60+ }
61+ }
62+
63+ private void update (Node n ) {
64+ remove (n );
65+ add (n );
66+ }
67+
68+ private void remove (Node n ) {
69+ Node before = n .prev , after = n .next ;
70+ before .next = after ;
71+ after .prev = before ;
72+ }
73+
74+ private void add (Node n ) {
75+ Node after = head .next ;
76+
77+ head .next = n ;
78+ n .prev = head ;
79+ n .next = after ;
80+ after .prev = n ;
81+ }
82+ }
You can’t perform that action at this time.
0 commit comments