Skip to content

Commit 181c2bf

Browse files
committed
seperate class
1 parent 0ceb2d1 commit 181c2bf

2 files changed

Lines changed: 73 additions & 52 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class Node:
2+
__slots__ = ("value", "next", "previous")
3+
4+
def __init__(self, value):
5+
self.value = value
6+
self.next = None
7+
self.previous = None
8+
9+
class LinkedList:
10+
def __init__(self):
11+
self.head = None
12+
self.tail = None
13+
14+
def push_head(self, value):
15+
node = Node(value)
16+
17+
if self.head is None:
18+
self.head = node
19+
self.tail = node
20+
else:
21+
node.next = self.head
22+
self.head.previous = node
23+
self.head = node
24+
25+
return node
26+
27+
def pop_tail(self):
28+
node = self.tail
29+
30+
if node is None:
31+
return None
32+
33+
self.remove(node)
34+
35+
return node.value
36+
37+
def remove(self, node):
38+
if node == self.head and node == self.tail:
39+
self.head = None
40+
self.tail = None
41+
42+
elif node == self.head:
43+
self.head = node.next
44+
self.head.previous = None
45+
46+
elif node == self.tail:
47+
self.tail = node.previous
48+
self.tail.next = None
49+
50+
else:
51+
node.previous.next = node.next
52+
node.next.previous = node.previous
53+
54+
node.next = None
55+
node.previous = None
Lines changed: 18 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,39 @@
1-
class Node:
2-
def __init__(self, key, value):
3-
self.key = key
4-
self.value = value
5-
self.next = None
6-
self.previous = None
1+
from linked_list import LinkedList
2+
73

84
class LruCache:
95
def __init__(self, limit):
106
if limit <= 0:
11-
raise ValueError
7+
raise ValueError("Limit must be greater than zero")
128

139
self.limit = limit
1410
self.cache = {}
15-
self.head = None
16-
self.tail = None
17-
18-
def _remove_node(self, node):
19-
if node.previous is not None:
20-
node.previous.next = node.next
21-
else:
22-
self.head = node.next
23-
24-
if node.next is not None:
25-
node.next.previous = node.previous
26-
else:
27-
self.tail = node.previous
28-
29-
def _add_to_tail(self, node):
30-
node.next = None
31-
node.previous = self.tail
32-
33-
if self.tail is not None:
34-
self.tail.next = node
35-
else:
36-
self.head = node
37-
38-
self.tail = node
11+
self.order = LinkedList()
3912

4013
def get(self, key):
4114
if key not in self.cache:
4215
return None
4316

4417
node = self.cache[key]
18+
value = node.value[1]
4519

46-
# Move node to the most-recently-used position
47-
if node is not self.tail:
48-
self._remove_node(node)
49-
self._add_to_tail(node)
20+
# Move the accessed item to the head.
21+
self.order.remove(node)
22+
new_node = self.order.push_head(node.value)
23+
self.cache[key] = new_node
5024

51-
return node.value
25+
return value
5226

5327
def set(self, key, value):
5428
if key in self.cache:
5529
node = self.cache[key]
56-
node.value = value
57-
58-
# Updating an item counts as using it
59-
if node is not self.tail:
60-
self._remove_node(node)
61-
self._add_to_tail(node)
62-
63-
return
64-
65-
node = Node(key, value)
66-
self.cache[key] = node
67-
self._add_to_tail(node)
30+
self.order.remove(node)
6831

69-
if len(self.cache) > self.limit:
70-
lru_node = self.head
32+
elif len(self.cache) >= self.limit:
33+
# Remove the least recently used item.
34+
lru_item = self.order.pop_tail()
35+
del self.cache[lru_item[0]]
7136

72-
self._remove_node(lru_node)
73-
del self.cache[lru_node.key]
37+
# Add the item to the head as most recently used.
38+
node = self.order.push_head((key, value))
39+
self.cache[key] = node

0 commit comments

Comments
 (0)