public class DoubleLink <T>{
privte DNode<T> mHead;
private int mCount;
private class DNode<T>{
public DNode prev;
public DNode next;
public T value;
public DNode(T value,DNode prev, DNode next){
this.value=value;
this.prev=prev;
this.next=next;
}
}
public DoubleLink(){
mHead=new DNode<T>(null,null,null);
mHead.prev=mHead.next=mHead;
mCount=0;
}
public int size(){
return mCount;
}
public boolean isEmpty(){
return mCount==0;
}
privte DNode<T> getNode(int index){
if(index<=0||index>mCount)
throw new IndexOutOfBoundsException();
if(index<=mCount/2){
DNode<T> node=mHead.next;
for(i=0;i<index;i++) node=node.next;
return node;
}
DNode<T> rNode=mHead.prev;
int rIndex=mCount-index-1;
for(int j=0;j<rIndex;j++) rNode=rMode.prev;
return rNode;
}
public T getIndex(){
return getNode(index).value;
}
public T getFirst(){
return getNode(0).value;
}
public T getLast(){
return getNode(mCount-1).value;
}
public void insert(int index, T t){
if(mCount==0){
DNode<T> node=new DNode<T>(t,mHead,mHead.next);
mHead.next.prev=node;
mHead.next=node
mCount++;
return ;
}
DNode<T> iNode=getNode(index);
DNode<T> tNode=new DNode<T>(t,iNode.prev,iNode);
iNode.prev.next=tNode;
iNode.prev=tNode;
mCount++;
return;
}
public void insertFist(T t){
insert(0,t);
}
public void appendLast(T t){
DNode<T> node=new DNode<T>(t,mHead.prev,mHead);
mHead.prev.next=node;
mHead.prev=node;
mCount++;
}
public void delNode(int index){
DNode<T> node=getNode(index);
node.prev.next=node.next;
node.next.prev=node.prev;
node=null;
mCount--;
}
public void deleteFirst(){
delNode(0);
}
public void deleteFirst(){
delNode(mCount-1);
}
}