Posted by: elciopa | Gennaio 26, 2008

Generic Doubly Linked List

Oggi è saltata la giornata al Carnevale di Venezia perchè sono state sospese tutte le manifestazioni della giornata visto il giorno di lutto per la città e quindi aspettando il domani per una bella giornata di festa Elciopa&Sangui Corporation hanno prodotto un pò di codice in java giusto per tenersi allenati e soprattutto al passo con lo studio.Il codice prodotto serve per implementare una Generic Doubly LinkedList ossia parlando terra terra una lista concatenata formata da degli elementi base (nodi) tutti concatenati fra di loro con doppio riferimento. Un riferimento punta all’elemento successivo (next) e l’altro elemente punta al precendente (prev). Nella figura sotto secondo me si capisce molto meglio cosa intendo :D .

doublylinkelist.jpg

Il primo nodo “vuoto” e l’ultimo sono dei nodi che non sono indispensabili ma aiutano a scrivere un codice migliore, più leggibile: rispettivamente sono il nodo head e il nodo tail. La chicca della giornata è però quella per cui la lista è di tipo Generic quindi può esser utilizzata per qualsiasi tipo di dato basta infatti specificare nel main del programma di che tipo si vuole creare l’oggetto di tipo LinkedList. Tutto questo è permesso da java 5.0 che ha introdotto l’uso di <E> (E è un esempio) dove si definisce che il tipo della lista è generico e lo si andrà a definire una volta che lo si vuole utilzzare. I sorgenti li metto in un file .zip e intanto qui posto il “core” del programma. Source

public class LinkedList {

private Nodo head;
private Nodo tail;

public LinkedList(){
head = new Nodo(null);
tail= new Nodo(null);
}

public boolean isEmpty(){
if (head==null)
return true;
else return false;
}

public void AddFirst(E elem){
Nodo nuovo = new Nodo (elem);
if (isEmpty()){
head.SetNext(nuovo);
tail.SetPrev(nuovo);
}
else{
nuovo.SetNext(head.GetNext());
nuovo.SetPrev(head);
head.SetNext(nuovo);
}
}

public void AddLast(E elem){
Nodo nuovo = new Nodo (elem);
if (isEmpty()){
head.SetNext(nuovo);
tail.SetPrev(nuovo);
}
else{
nuovo.SetNext(tail);
nuovo.SetPrev(tail.GetPrev());
tail.SetPrev(nuovo);
}
}

public E RemoveFirst(){
E app = (E)head.GetNext().GetElement();
head.SetNext(head.GetNext().GetNext());
return app;
}

public E RemoveLast(){
E app =(E)tail.GetPrev().GetElement();
tail.SetPrev(tail.GetPrev().GetPrev());
return app;
}

public String toString(){
String s=”";
Nodo tmp = head;
tmp=tmp.GetNext();
while(tmp!=null){
s+=tmp.GetElement() + ” : “;
tmp=tmp.GetNext();
}
return s;
}
}

Leave a response

Your response:

Categorie