import java.util.Iterator; // Custom Linked List class using Generics class List implements Iterable { Node head, tail; // add new Element at tail of the linked list in O(1) public void add(T data) { Node node = new Node<>(data, null); if (head == null) tail = head = node; else { tail.setNext(node); tail = node; } } // return Head public Node getHead() { return head; } // return Tail public Node getTail() { return tail; } // return Iterator instance public Iterator iterator() { return new ListIterator(this); } } class ListIterator implements Iterator { Node current; // initialize pointer to head of the list for iteration public ListIterator(List list) { current = list.getHead(); } // returns false if next element does not exist public boolean hasNext() { return current != null; } // return current data and update pointer public T next() { T data = current.getData(); current = current.getNext(); return data; } // implement if needed public void remove() { throw new UnsupportedOperationException(); } } // Constituent Node of Linked List class Node { T data; Node next; public Node(T data, Node next) { this.data = data; this.next = next; } // Setter getter methods for Data and Next Pointer public void setData(T data) { this.data = data; } public void setNext(Node next) { this.next = next; } public T getData() { return data; } public Node getNext() { return next; } } // Driver class class Main { public static void main(String[] args) { // Create Linked List List myList = new List<>(); // Add Elements myList.add("abc"); myList.add("mno"); myList.add("pqr"); myList.add("xyz"); // Iterate through the list using For Each Loop for (String string : myList) System.out.println(string); } }