LRUCache LeetCode OJ

# LRUCache

class DictMap:
    def __init__(self):
        self.dict = {}
        self.size = 0
    def set(self, key, value):
        self.size+=1
        self.dict[key] = value
    def get(self, key):
        value = None
        if(self.containKey(key)):
            value = self.dict[key]
        return value
    def remove(self, key):
        del self.dict[key]
        self.size-=1
    def containKey(self, key):
        try:
            self.dict[key]
            return True
        except:
            return False

class Entry:
    def __init__(self, k, v):
        self.k = k
        self.v = v
        self.pre = None
        self.next = None
        

class LRUCache(object):

    def __init__(self, capacity):
        self.c = capacity
        self.m = DictMap()
        self.head = Entry(-1, -1)
        self.tail = Entry(1, 1)
        self.head.next = self.tail
        self.tail.pre = self.head
        

    def get(self, key):
        if(self.m.containKey(key)):
            e = self.m.get(key)
            self.__moveToHead(e)
            return e.v
        else:
            return -1
        

    def set(self, key, value):
        if(self.m.containKey(key)):
            e = self.m.get(key)
            e.v = value
            self.__moveToHead(e)
        elif(self.m.size<self.c):
            e = Entry(key, value)
            self.__moveToHead(e)
            self.m.set(key, e)
        else:
            e = Entry(key, value)
            self.__moveToHead(e)
            self.m.set(key, e)
            index = self.__removeEnd()
            self.m.remove(index)


    def __removeEnd(self):
        e = self.tail.pre
        self.tail.pre.pre.next = self.tail
        self.tail.pre = e.pre
        e.pre = None
        e.next = None
        return e.k

    def __moveToHead(self, e):
        if(e.next!=None and e.pre!=None):
            e.pre.next = e.next
            e.next.pre = e.pre
        e.pre = self.head
        e.next = self.head.next
        self.head.next.pre = e
        self.head.next = e


你可能感兴趣的:(LRUCache LeetCode OJ)