*circularValues() {

        // special case: list is empty
        if (this[head] !== null) {

            /*
             * The `current` variable is used to iterate over the list nodes.
             * It starts out pointing to the head and is overwritten inside
             * of the loop below.
             */
            let current = this[head];

            /*
             * This is an infinite loop if you remove the `yield` call. The `yield`
             * allows execution to stop and not pick up again until the iterator's
             * `next()` method is called again.
             * 
             * It's not possible for this loop to exit. Even removing all nodes
             * from the list using `remove()` or `clear()` will not cause the 
             * loop to stop yield values. That's because `current.next` always
             * has a value, even if it just points back to `current`.
             */
            do {
                yield current.data;
                current = current.next;
            } while (true);
        }

    }
Create an iterator that returns each node in the list and repeats
each node if it continues to be called. This is designed to be used
to manually iterate through the list, outside of using syntax such
as `for-of` (which will result in an infinite loop with this iterator).
@returns {Iterator} A circular iterator on the list.