1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| class ListNode(object): def __init__(self, key, val): self.key = key self.val = val self.next = None self.prev = None
def __repr__(self): return str(self.val)
class LRUCache(object):
def __init__(self, capacity): """ :type capacity: int """ self.capacity = capacity self.size = 0 self.dummy_head = ListNode(None, -1) self.dummy_tail = ListNode(None, -1) self.dummy_head.next = self.dummy_tail self.dummy_tail.prev = self.dummy_head self.store = {}
def print_list(self): cur = self.dummy_head.next while cur != self.dummy_tail: print cur.val, '->', cur = cur.next print
def move_to_head(self, node): if node == self.dummy_head or node == self.dummy_tail: return if node.prev: node.prev.next = node.next if node.next: node.next.prev = node.prev node.prev = self.dummy_head node.next = self.dummy_head.next self.dummy_head.next.prev = node self.dummy_head.next = node
def get(self, key): """ :rtype: int """ node = self.store.get(key, self.dummy_head) self.move_to_head(node) return node.val
def set(self, key, value): """ :type key: int :type value: int :rtype: nothing """ if key in self.store: node = self.store[key] node.val = value self.move_to_head(node) elif self.size < self.capacity: node = ListNode(key, value) self.move_to_head(node) self.store[key] = node self.size += 1 else: last = self.dummy_tail.prev del self.store[last.key] last.val = value last.key = key self.store[last.key] = last self.move_to_head(last)
|