Brick icon

list_node

Brick | PRO | 06/24/18 03:30:40 PM UTC | 0 ⭐ | 259 👁️ | Never ⏰ | []
C++ |

1.64 KB

|

None

|

0 👍

/

0 👎

struct list_node
{
    list_node* prev;
    list_node* next;
 
    list_node()
        : prev(this)
        , next(this)
    { }
 
    void link(list_node* node)
    {
        list_node* temp_prev = node->prev;
        list_node* temp_next = next;
 
        node->prev = temp_next->prev;
        temp_next->prev = temp_prev;
 
        next = temp_prev->next;
        temp_prev->next = temp_next;
    }
 
    void push_front(list_node* node)
    {
        link(node);
    }
 
    void push_back(list_node* node)
    {
        prev->link(node);
    }
 
    void merge(list_node* head)
    {
        list_node* first_value = head->next;
 
        if (first_value != head)
        {
            head->unlink();
 
            push_back(first_value);
        }
    }
 
    void unlink()
    {
        link(this);
    }
 
    bool empty() const
    {
        return next == this;
    }
 
    struct iterator
    {
    protected:
        list_node* value;
 
    public:
        iterator(list_node* value)
            : value(value)
        { }
 
        list_node& operator*() const
        {
            return *value;
        }
 
        bool operator!=(const iterator& rhs) const
        {
            return rhs.value != value;
        }
 
        iterator& operator++()
        {
            value = value->next;
 
            return *this;
        }
 
        iterator& operator--()
        {
            value = value->prev;
 
            return *this;
        }
    };
 
    iterator begin()
    {
        return iterator(next);
    }
 
    iterator end()
    {
        return iterator(this);
    }
};

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎