Optimization for DoublyLinkedList

Added add, get, and remove first/last methods to optimize for
operations at the head and tail of the list.  Normal add, get, and
remove methods find the index and use it which is O(N) worst case
versus O(1) for optimized versions.