add(data) {
    
        /*
         * Create a new list item object and store the data in it.
         * This item will be added to the end of the existing list.
         */
        const newNode = new CircularDoublyLinkedListNode(data);
                
        // special case: no items in the list yet
        if (this[head] === null) {

            /*
             * Because there are no items in the list, just set the
             * `this[head]` pointer to the new item.
             */
            this[head] = newNode;

            /*
             * Setup the new node to point to itself in both directions
             * to create the circular link.
             */
            newNode.next = newNode;
            newNode.previous = newNode;
        } else {

            // get a reference to the last item in the list
            const tail = this[head].previous;

            /*
             * Setup the tail and `newNode` to point to each other, effectively
             * adding `newNode` to the end of the list.
             */
            tail.next = newNode;
            newNode.previous = tail;
            
            /*
             * Because `newNode` is now the last item, `newNode.next` must point
             * to the head and vice versa.
             */
            newNode.next = this[head];
            this[head].previous = newNode;
        }
    }
Appends some data to the end of the list. This method traverses
the existing list and places the data at the end in a new item.
@param {*} data The data to add to the list.
@returns {void}