import java.util.Iterator;import java.util.NoSuchElementException;publicclassMyArrayList<T>implementsIterable<T>{privatestaticfinalint default_size =10;privateint theSize;private T[] theItems;publicMyArrayList(){doClear();}publicvoidclear(){doClear();}privatevoiddoClear(){
theSize =0;ensureCapacity(default_size);}publicintsize(){return theSize;}publicbooleanisEmpty(){returnsize()==0;}publicvoidtrimToSize(){ensureCapacity(size());}public T get(int index){if(index <0|| index >=size()){thrownewArrayIndexOutOfBoundsException();}return theItems[index];}public T set(int index, T t){if(index <0|| index >=size())thrownewArrayIndexOutOfBoundsException();
T old = theItems[index];
theItems[index]= t;return old;}publicvoidensureCapacity(int newCapacity){if(newCapacity < theSize){return;}
T[] old = theItems;
theItems =(T[])newObject[newCapacity];for(int i =0; i <size(); i++){
theItems[i]= old[i];}}publicbooleanadd(T t){add(size(), t);returntrue;}publicvoidadd(int index, T t){if(theItems.length ==size()){ensureCapacity(size()*2+1);}for(int i = theSize; i > index; i--){
theItems[i]= theItems[i -1];}
theItems[index]= t;
theSize++;}public T remove(int index){
T old = theItems[index];for(int i = index; i <size(); i++){
theItems[i]= theItems[i+1];}
theSize--;return old;}@Overridepublic Iterator<T>iterator(){return null;}privateclassArrayListIteratorimplementsIterator<T>{privateint current =0;@OverridepublicbooleanhasNext(){return current <size();}@Overridepublic T next(){if(!hasNext())thrownewNoSuchElementException();return theItems[current++];}publicvoidremove(){
MyArrayList.this.remove(--current);}}}
2. LinkedList
import java.util.ConcurrentModificationException;import java.util.Iterator;import java.util.NoSuchElementException;publicclassMyLinkedList<T>implementsIterable<T>{privatestaticclassNode<T>{private T data;private Node<T> prev;private Node<T> next;publicNode(T data, Node<T> prev, Node<T> next){this.data = data;this.prev = prev;this.next = next;}}privateint theSize;privateint modCount =0;private Node<T> beginMarker;private Node<T> endMarker;publicMyLinkedList(){doClear();}publicvoidclear(){doClear();}privatevoiddoClear(){
beginMarker =newNode<>(null, null, null);
endMarker =newNode<>(null, null, null);
beginMarker.next = endMarker;
theSize =0;
modCount++;}publicintsize(){return theSize;}publicbooleanisEmpty(){returnsize()==0;}publicbooleanadd(T t){add(size(), t);returntrue;}publicvoidadd(int index, T t){addBefore(getNode(index,0,size()), t);}public T get(int index){returngetNode(index).data;}public T set(int index, T newData){
Node<T> p =getNode(index);
T data = p.data;
p.data = newData;return data;}public T remove(int index){returnremove(getNode(index));}/**
* add an item to this collection, at specified position p
* <p>
* item at or after that position are slid one position higher
*
* @param p Node to add before
* @param t any object
*/privatevoidaddBefore(Node<T> p, T t){
Node<T> newNode =newNode<>(t, p.prev, p);
newNode.prev.next = newNode;
p.prev = newNode;
theSize++;
modCount++;}/**
* remove the object contained in node p
*
* @param p
* @return
*/private T remove(Node<T> p){
p.prev.next = p.next;
p.next.prev = p.prev;
theSize--;
modCount++;return p.data;}private Node<T>getNode(int index){returngetNode(index,0,size()-1);}private Node<T>getNode(int index,int lower,int upper){
Node<T> p;if(index < lower || index > upper)thrownewIndexOutOfBoundsException();if(index <size()/2){
p = beginMarker.next;for(int i =0; i < index; i++){
p = p.next;}}else{
p = endMarker;for(int i =size(); i > index; i--){
p = p.prev;}}return p;}@Overridepublic Iterator<T>iterator(){return null;}publicclassLinkedListIteratorimplementsIterator<T>{private Node<T> current = beginMarker.next;privateint expectCount = modCount;privateboolean okToRemove =false;@OverridepublicbooleanhasNext(){return current != endMarker;}@Overridepublic T next(){if(modCount != expectCount)thrownewConcurrentModificationException();if(!hasNext())thrownewNoSuchElementException();
T data = current.data;
current = current.next;
okToRemove =true;return data;}@Overridepublicvoidremove(){if(modCount != expectCount)thrownewConcurrentModificationException();if(!hasNext())thrownewNoSuchElementException();
MyLinkedList.this.remove(current.prev);
expectCount++;
okToRemove =false;}}}