![]()
public class doubleLinkedList <Item>{
private Node first;
private Node last;
private int itemcount;
class Node{
Node prev;
Node next;
Item item;
}
public void addFirst(Item item){
Node oldfirst=first;
first=new Node();
first.item=item;
first.next=oldfirst;
if(oldfirst!=null){
oldfirst.prev=first;
}
if(itemcount==0){
last=first;
}
itemcount++;
}
public void addlast(Item item){
Node oldlast=last;
last=new Node();
last.item=item;
last.prev=oldlast;
if(oldlast!=null){
oldlast.next=last;
}
if(itemcount==0){
last=first;
}
itemcount++;
}
//
public Item delfirst(){
if(first==null){
throw new NullPointerException("no node linked list");
}
Item item=first.item;
first=first.next;
if(first!=null){
first.prev=null;
}
if(itemcount==1){
last=null;
}
itemcount--;
return item;
}
public Item dellast(){
if(last==null){
throw new NullPointerException("no node this linked");
}
Item item =last.item;
last=last.prev;
if(last!=null){
last.next=null;
}
if(itemcount==1){
first=null;
}
itemcount--;
return item;
}
//
public void addbefore(Item targetItem,Item item){
Node target=first;
if(target==null){
throw new NullPointerException("no node this linked");
}
if(target!=null && target.item!=targetItem){
target=target.next;
}
if(target.prev==null){
addFirst(item);
}
else{
Node targetprev=target.prev;
Node newtarget=new Node();
newtarget.item=item;
target.prev=newtarget;
newtarget.next=target;
newtarget.prev=targetprev;
targetprev.next=newtarget;
itemcount++;
}
}
//
public void addafter(Item targetItem,Item item){
Node target =first;
if(target==null){
throw new NullPointerException("no node this linked!");
}
if(target!=null && target.item!=targetItem){
target=target.next;
}
if(target.next==null){
addlast(item);
}
else{
Node oldtarget=target.next;
Node newnode=new Node();
newnode.item=item;
newnode.next=oldtarget;
oldtarget.prev=newnode;
target.next=newnode;
newnode.prev=target;
itemcount++;
}
}
}