import java.util.Iterator;
import java.util.Random;

public class SortedList<Item extends Comparable<Item>> implements Iterable<Item> {
    
    private class Node {
        Item item;
        Node next;
    }
   
    private Node first;
    
    public Iterator<Item> iterator() {
        return new Iterator<Item>() {
            Node node = first;
            
            public boolean hasNext() {
                return (node != null);
            }
            
            public Item next() {
                Item item = node.item;
                node = node.next;
                return item;
            }
        };
    }
    
    public String toString() {
        String str = "";
        for (Item s : this) {
            str += s + "->";
        }
        return str;
    }
    
    public void insertInOrder(Item item) {
        // Note: assumes list is in order from least to greatest as dictated 
        // by Item's implementation of Comparable interface
        
        Node node = new Node();
        node.item = item;
        
        if (first == null)                           
            first = node;
        else if (item.compareTo(first.item) < 0) {   
            node.next = first;
            first = node;
        }
        else {                                       
            Node n = first;
            while ((n.next != null) && (item.compareTo(n.next.item) > 0))
                n = n.next;
            
            if (n.next == null)                      
                n.next = node;
            else {                                   
                node.next = n.next;
                n.next = node;
            }
        }
    }

    public static void main(String[] args) {
        SortedList<Integer> list = new SortedList<Integer>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            list.insertInOrder(random.nextInt(200));
        }
        System.out.println(list);
    }
}

