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

            /*
             * Because there are no nodes in the list, set `node.next`
             * equal to itself to complete the cycle.
             */
            newNode.next = newNode;
        } else {

            /*
             * We are inserting `newNode` in between `this[tail]` and
             * `this[tail].next`, so update pointers.
             */
            newNode.next = this[tail].next;
            this[tail].next = newNode;
        }
        
        // update the pointer to the last inserted node
        this[tail] = 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 node.
@param {*} data The data to add to the list.
@returns {void}