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);
*/