find(matcher) {
    
        /*
         * 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 loop checks each node in the list to see if it matches.
         * If a match is found, it returns the data immediately, exiting the
         * loop because there's no reason to keep searching. The search
         * continues until there are no more nodes to search (when `current` is `null`).
         */
        while (current !== null) {
            if (matcher(current.data)) {
                return current.data;
            }

            // traverse to the next node in the list
            current = current.next;
        }

        /*
         * If execution gets to this point, it means we reached the end of the
         * list and didn't find `data`. Just return `undefined` as the 
         * "not found" value.
         */
        return undefined;
    }
Returns the first item that matches a given function.
@param {Function} matcher A function returning true when an item matches
     and false when an item doesn't match.
@returns {*} The first item that returns true from the matcher, undefined
     if no items match.