import java.util.Iterator;

class Node {
  Node(int val) {
    this.val = val;
  }
  public String toString() {
    return Integer.toString(val);
  }
  int val;
  Node next = null;
}

public class List implements Iterable
{
  Node head = null;
  public void prepend(int val) {
    Node q = new Node(val);
    q.next = head;
    head = q;
  }
  public void print1() {
    Node p=head;
    while(p != null) {
			Out.println(p.val);
      p = p.next;
    }
  }
	class ListIterator implements Iterator {
		ListIterator(Node head) {
			this.p = head;
		}
		public void remove() {
			throw new UnsupportedOperationException();
		}
		public boolean hasNext() {
			return (p != null);
		}
		public Object next() {
			Node q = p;
			p = p.next;
			return q;
		}
		private Node p;
	}
	public ListIterator iterator() {
		return new ListIterator(head);
	}
	public void print2() {
		Iterator it = iterator();
		while(it.hasNext()) {
			Node n = (Node) it.next();
			Out.println(n);
		}
//		Object o;
//		for(Iterator it = iterator(); it.hasNext(); ) {
//			o = it.next();
//			Out.println((Node) o);
//		}
	}
	public void print3() {
		for(Object o: this) {
			Out.println((Node) o);
		}
	}
	public static void main(String[] args) {
    List l1 = new List();
    l1.prepend(6);
    l1.prepend(5);
    l1.prepend(4);
    l1.prepend(3);
    l1.prepend(2);
    l1.prepend(1);
		Out.println("print with list traversal");
		l1.print1();
		Out.println("print with iterator");
		l1.print2();
		Out.println("print with foreach");
		l1.print3();
  }
}

