@Override
        public boolean hasNext() {
            // if not initialized, initialize it first.
            if (this.currentElementItr == null) {
                if (this.currentListItr.hasNext()) { // have lists
                    this.currentElementItr = this.currentListItr.next()
                            .iterator();
                } else {
                    return false; // no lists, return false
                }
            }
            // initialized, and has next element
            if (this.currentElementItr.hasNext()) {
                return true;
            }
            // initialized, but doesn't has next element
            if (this.currentListItr.hasNext()) {
                // get next list to iterate
                this.currentElementItr = this.currentListItr.next().iterator();
                return this.currentElementItr.hasNext();
            } else {
                return false;
            }
            // the lists are added in a queue, there's no need to check the
            // third list, because it won't be exist.
        }