题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
class LinkNode{ public: int key; int val; LinkNode * pNext; LinkNode * pPre; LinkNode(int key, int val){ this->key = key; this->val = val; pNext = NULL; pPre = NULL; } }; class Solution{ public: /** * lru design * @param operators int整型vector<vector<>> the ops * @param k int整型 the k * @return int整型vector */ Solution(){ head = new LinkNode(0, 0); tail = new LinkNode(0, 0); head->pNext = tail; tail->pNext = head; } vector<int> LRU(vector<vector<int> >& operators, int k) { // write code here this->capaticy = k; vector<int> ret; if(operators.empty()) return ret; for(int i = 0; i<operators.size(); i++){ //cout<<nodeMap.size()<<i <<endl; int opt = operators.at(i)[0]; if(opt == 1){ int key = operators.at(i)[1]; int val = operators.at(i)[2]; Put(key, val); } else if(opt == 2){ int valRet = Get(operators.at(i)[1]); ret.push_back(valRet); } } return ret; } void Add(LinkNode *node){ node->pPre = head; node->pNext = head->pNext; head->pNext->pPre = node; head->pNext = node; } void Remove(LinkNode *node){ node->pPre->pNext = node->pNext; node->pNext->pPre = node->pPre; } void UpDate(LinkNode *node){ Remove(node); Add(node); } int Get(int key){ LinkNode * node = nodeMap[key]; if(!node) return -1; UpDate(node); return node->val; } void Put(int key, int val){ LinkNode *node = nodeMap[key]; // 没有找到就放到头部后面 if(!node) { node = new LinkNode(key, val); Add( node); nodeMap[key] = node; this->currCount++; }else{ node->val = val; UpDate(node); } // 超容,删除尾部节点 if(this->currCount > this->capaticy){ LinkNode * node = tail->pPre; LinkNode * pre = tail->pPre->pPre; pre->pNext = tail; tail->pPre = pre; nodeMap.erase(node->key); free(node); this->currCount--; } } private: int capaticy; int currCount = 0; LinkNode *head; LinkNode *tail; map<int, LinkNode*> nodeMap ; };