我写的代码依然比较丑陋,只需要记住实现以下东西:
>>> 链表节点 struct Node{...},包含 int key, int value, Node* next, Node *pred。
>>> 双向链表 Node *head, *tail,链表的描述信息 int size, int capacity
>>> 哈希表 map<int, Node*> hashTable
为了保证代码整洁,我实现了两个方法:Node* addToTail(int k, int v) 和 void moveToTail(Node* node)。
接下来的策略:
>>> 如果是 get,那么检查 hashTable 中是否有key(auto iter = hashTable.find(key); iter == hashTable.end()?),有则moveToTail(iter->second); return tail->val,否则 return -1。
>>> 如果是 put,那么在链表 size < capacity 时,直接 auto node = addToTail(key, value); hashTable[key] = node。不然,则看 key 是否在 hashTable 中。
>>>>>> 如果是,直接 moveToTail 并更新值。
>>>>>> 否则,moveToTail(head) 并更新 head 的内容,再更新 hashTable 中的内容。
Node* addToTail(int k, int v)