双向链表

    template <typename T>
    struct List {
        sp<T> head;
        wp<T> tail;
        sp<T> pending;
        uint32_t count;
        List()
          : head(NULL)
          , tail(NULL)
          , pending(NULL)
          , count(0){
        }
        bool add() {
            if (add(pending)) {
                pending.clear();
                return true;
            }
            return false;
        }
        bool add(sp<T> &n) {
            if (n.get()) {
                if (head == NULL) {
                    head = n;
                    tail = n;
                } else {
                    ASSERT(tail != NULL);
                    tail.promote()->next = n;
                    n->prev = tail;
                    tail = n;
                }
                ++count;
                return true;
            }
            return false;
        }
        bool remove(sp<T> &p) {
            return remove(p.get());
        }
        bool remove(T *c) {
            if (c) {
                T *t = head.get();
                while (t) {
                    if (t == c) {
                        ASSERT(count);
                        wp<T> p = t->prev;
                        sp<T> n = t->next;
                        if (p.promote().get()) {
                            p.promote()->next = n; // c or t has be removed
                        } else {
                            head = n;
                        }
                        if (n.get()) {
                            n->prev = p;
                        } else {
                            tail = p;
                        }
                        --count;
                        return true;
                    }
                    t = t->next.get();
                }
            }
            return false;
        }
        bool empty() {
            return head == NULL;
        }
        void clear() {
            head.clear();
            pending.clear();
            count = 0;
        }
    };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值