Java programiranje lista - povezati head and tail

ej ljudi…pozdrav…

ovako,napisao sam code u javi…radi se o listi…ali meni sad treba da bude cirkularna…ne mogu povezati head and tail…
znam da je fazon u par linija ali ne znam kako…uradio sam to u c++ ali u javi ne mogu…jer nema pointera…moze li mi ko pomoci

hvala unaprijed…

evo source: (test i element klasa vam ne treba…pretpostavljam :frowning: )

public class Lista{
private element prvi;
public void Lista(int b){
prvi=new Element(b);
}
public void prazni(){
prvi=null;
}
public int duzina(){
int n=0;
for(element tek=prvi; tek!=null; tek=tek.sljedeci);
n++;
return n;
}
public String toString(){
String s=" “;
for(element tek=prvi; tek!=null; tek=tek.sljedeci);
s+=tek.broj+” ";
return s;
}
public void naPocetak(int b){
prvi=new Element(b, prvi);
}
public void naKraj(int b){
Element novi=new Element(b);
if(prvi==null)
prvi=novi;
else{
Element tek=prvi;
while(tek.sljedeci!=null)
tek=tek.sljedeci;
tek.sljedeci=novi;
}
}
public void umetni(int b){
Element tek=prvi,pret=null;
while(tek!=null && tek.broj<b){
pret=tek;
tek=tek.sljedeci;
}
Element novi=new Element(b, tek);
if(pret==null)prvi=novi;
else pret.sljedeci=novi;
}
public void izostavi(int b){
Element tek=prvi, pret=null;
while(tek!=null)
if(tek.broj!=b){
pret=tek;
tek=tek.sljedeci;
}
else{
tek=tek.sljedeci;
if(pret==null)prvi=tek;
else pret.sljedeci=tek;
}
}
}

Gadan ti taj kod, mogao si da ga stavis pod: code
da se bolje vidi. Elem, ako ti lista ide ukrug, onda ne mozes da koristis onakav toString jer bi upao u beskonacnu petlju. Ako petlja ide u krug onda je ocigledno da nijedan element nece imati svojsvo slijedeci == null. Zato ako vec vrsis iteraciju, kreces od prvog elementa i ides dok opet ne dodjes do njega. To mozes elegantno sa do{}while().

Sve sto trebas da uradis da obicnu takvu listu “zaokruzis” jeste da svaki put kada dodajes novi element (na kraj liste) postavis da je njemu slijedeci element - prvi element u listi.

Time ces na kraj liste dodati pocetni element

Ako malo bolje proucis, naci ces da su sve variajble s objektima ustvari kao pointeri na te objekte, osim u slucaju primitivnih tipova (double, int, char, boolan), a ako ti i za njih treba objekat imas klase Double, Integer, Character, Boolean. Uglavnom ako hoces cirkularnu listu prilicno lako to mozes postici sa java.util.LinkedList i napravis objekt kojim ces extend link list i dodas (ne znam jeli override ili ne) fino method next i varijablu da pratis tekuci element i kada dodjes do kraja vratis ga nazad znaci nesto tipa:
int tekuciElement;
if(tekuciElement==super.size() )
tekuciElement=0;
i eto ti cirkularne liste od linkliste imaces add, remove i sve ostale fazone a samo dodas sto tebi jos treba. vise detalja ces naci na java.sun.com pod tutorialima potrazi collections i pogledaj tamo sta sve mozes i sta imas od gotovih stvari (hashmap, linkedlist, stack i sl.)

ch

U Javi klasa moze imati referencu na sebe (self-reference), tj. to ti je tail liste.

[code]public class LList {
public LList() {
head = null;
tail = null;
}

protected void setHead(Object head) {
    this.head = head;
}

protected Object getHead() {
    return head;
}

public void dodaj(Object anElement) {
    if(head == null) {
        head = anElement;
    }
    else if(tail == null) {
        tail = new LList();
        tail.dodaj(anElement);
    }
    else {
        tail.dodaj(anElement);
    }
}

// dodaj ostale metode

private Object head;
private LList tail;

}[/code]
Znaci pises kod kao u C++u s tim sto nemas pointer na objekat iste klase vec “object reference” iste klase.

Nadam se da ti je ovo dovoljno.

Benjamin