LRU 双向链表+哈希表 python

通过双向链表和哈希表的结合实现LRU

class Node:
    def __init__(self, key = 0, value=0):
        self.key = key
        self.value = value
        self.next = None
        self.pre = None
            
class Solution:
    def __init__(self, max_size = 0):
        self.dummy = Node()
        self.tail = self.dummy
        self.dic = {}
        self.size = 0
        self.max_size = max_size
    
    def set(self, key, value):
        if key not in self.dic:
            node = Node(key, value)
            self.size += 1 # 只有不存在的点才要+size
        else:
            node = self.dic[key]
            node.value = value
            if node.next == None:
                return
            pre = node.pre
            nxt = node.next
            pre.next = nxt
            nxt.pre = pre   # 一定要记得把下一个node的pre调好
        node.next = None
        node.pre = self.tail
        self.tail.next = node
        self.tail = self.tail.next
        self.dic[key] = node
        
        if self.size > self.max_size:
            node = self.dummy.next
            nxt = node.next
            self.dummy.next = nxt
            if nxt != None:
                nxt.pre = self.dummy  # 一定要记得把下一个node的pre调好
            self.dic.pop(node.key)
#             del self.dic[node.key]
            self.size -= 1
            
    def get(self, key):
        if key not in self.dic:
            return -1
        node = self.dic[key]
        if node.next == None: # 当查到的元素是最后一个的时候,不能使用下面的方法,因为node.pre = self.tail中node和tail是同一个元素
            return node.value
        pre = node.pre
        nxt = node.next
        pre.next = nxt
        nxt.pre = pre  # 一定要记得把下一个node的pre调好 'NoneType' object has no attribute 'pre'
        node.pre = self.tail
        node.next = None
        self.tail.next = node
        self.tail = self.tail.next
        return node.value
            
    def LRU(self , operators , k):
        # write code here
        self.max_size = k
        rst = []
        i = 0
        for arr in operators:
            if arr[0] == 1:
                self.set(arr[1], arr[2])
                
            elif arr[0] == 2:
                
                rst.append(self.get(arr[1]))
#             i+=1
#             print(i, self.dic)
#             cur = self.dummy.next
#             tmp = []
#             while cur != None:
#                 print('/*-', end='')
#                 tmp.append(cur.key)
#                 cur = cur.next
#             print(tmp)
#             cur = self.tail
#             tmp2 = []
#             while cur != self.dummy:
#                 print('/*-', end='')
#                 tmp2.append(cur.key)
#                 cur = cur.pre
#             print(tmp2)
            
            
        return rst
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值