注意几点:
1. 缓存长度在上层修改,不要在底层函数修改!!
2. 注意同步维护 umap和doubleList ;
class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    struct Node {
        Node(int k, int v): key(k), val(v) {
            prev = nullptr;
            next = nullptr;
        }
        int key, val;
        Node *prev, *next;

    };
    class DoubleList {
public:
            DoubleList(int k) {
                cap = k;
                first = new Node(0, 0);
                last = new Node(0, 0);
                first->next = last;
                first->prev = nullptr;
                last->prev = first;
                last->next = nullptr;
            }
        ~DoubleList () {
            delete(first);
            delete(last);
        }
            int get(int key) {
                if ( umap.count(key ) == 0 ) return -1;
                int res = umap[key]->val;
                moveToLast(umap[key]);
                return res;
            }
            void set(int key, int value) {
                if ( umap.count( key ) != 0 ) {
                    umap[key]->val = value;
                    moveToLast(umap[key]);
                    return;
                }
                if ( len >= cap ) {
                    int rk = removeFirst();
                    umap.erase(rk);
                    --len;
                }
                Node *node = new Node(key, value);
                umap[key] = node;
                addLast(node);
                ++len;
            }
    private:
            unordered_map<int, Node *> umap;
            int cap, len;
        Node *last, *first;
        void addLast(Node *node) {
            if ( !node ) return;
            last->prev->next = node;
            node->prev = last->prev;
            node->next = last;
            last->prev = node;
            // ++len;
        }
        int remove(Node *n) {
            n->prev->next = n->next;
            n->next->prev = n->prev;
            int rk = n->key;
            delete(n);
            return rk;
            //--len;
        }
        int removeFirst()
        {
            // if ( len <= 0 ) return;
            return remove(first->next);
        }
        void moveToLast(Node *n) {
            if ( n->next == last ) {
                return;
            }
            n->prev->next = n->next;
            n->next->prev = n->prev;
            addLast(n);
        }
    };
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        vector<int> res;
        DoubleList dl = DoubleList(k);
        for (int i=0;i<operators.size(); ++i) {
            if(operators[i][0] == 1) {
                dl.set(operators[i][1], operators[i][2]);
            } else if ( operators[i][0] == 2 ) {
                res.push_back( dl.get( operators[i][1] ) );
            }
        }
        return res;
    }
};