struct doublelist { //构建双指针结构,其中有一个哈希表的键,用于删除时,找到哈希表中的元素 doublelist* back = nullptr; //用ListNode会与默认的已经设置好的LIstNode重定义; doublelist* next = nullptr; int val, key_back; doublelist(int value, int key): val(value), key_back(key){} //列表初始化,使用() }; class Solution { private: int cap; int size = 0; //记录目前大小,判断容量是否已满,则删 unordered_map<int, doublelist*> store1; doublelist *head = new doublelist(0, -1); //链表的前后顺序表示最近使用,使用一次放在表头; doublelist *tail = new doublelist(0, -1); //因为要在链头添加,链尾删除,则需要头尾节点方便操作 public: Solution(int capacity) { cap = capacity; head->next = tail; tail->back = head; //类的成员变量初始化只能在构造函数中做,不能直接在类体中写“逻辑代码”。 } int get(int key) { if (store1.find(key) != store1.end()) { //找到了,则移动:缝补,添加 doublelist* node = (*store1.find(key)).second; int val = node->val; node->back->next = node->next; node->next->back = node->back; node->next = head->next; node->back = head; node->next->back = node; head->next = node; return val; } else { return -1; } } void set(int key, int value) { if(store1.find(key) != store1.end()){ (*store1.find(key)).second->val = value; //哈希表找到链表,修改值 }else{ if(size == cap){ store1.erase(tail->back->key_back); //先删除哈希表中的记录,链表找到哈希表 tail->back = tail->back->back; tail->back->next = tail; --size; } store1[key] = new doublelist(value, key); //添加元素,哈希表到链表 auto newnode = store1[key]; //头添加 newnode->next = head->next; newnode->back = head; newnode->next->back = newnode; head->next = newnode; ++size; //大小+1; } } }; /** * Your Solution object will be instantiated and called as such: * Solution* solution = new Solution(capacity); * int output = solution->get(key); * solution->set(key,value); */