Forum » Programiranje » [JAVA] rekurzivno obračanje seznama
[JAVA] rekurzivno obračanje seznama
l0g1t3ch ::
Se da komu pogledat in popravit metodo, ki naj bi rekurzivno obrnila seznam.
pa še tole ko mam za primerjat če sta dve množici enaki mi sedaj deluje samo če sta obe enak dolgi ali pa d je prvi seznam dalši. Se da naredit brez začetnega ugotavljanja njune dolžine to da bi delalo v vseh primerih.
class Seznam { int en; Seznam next; } class Main { protected static Seznam first, obrnjen; protected static Seznam first2; public static void main(String args[]) { for(int i = 0; i<5; i++ ) first = dodaj(first,i); System.out.print("\nOriginal seznam"); izpisi(first); System.out.print("Obrnjen seznam"); obrnjen = obrni(obrnjen, first); izpisi(obrnjen); // for(int i = 0; i<5; i++ ) // first2 = dodaj(first2,i); // izpisi(first2); // preveri(first, first2); } public static void preveri(Seznam s1, Seznam s2) { if(s1 != null) { if( nahaja(s1.en, s2) ) preveri(s1.next, s2); else System.out.print("Različni"); } } public static boolean nahaja(int a, Seznam s) { if(s == null) return false; else if(s.en == a) return true; else { return nahaja(a, s.next); } } public static Seznam dodaj(Seznam s, int vred) { Seznam nov_element = new Seznam(); nov_element.en = vred; nov_element.next = s; return nov_element; } public static void izpisi(Seznam s) { while( s != null) { System.out.print(" "+ s.en); s = s.next; } System.out.println("\n"); } public static Seznam obrni(Seznam obrnjen, Seznam prvotni) { Seznam temp = null; if(prvotni != null) { Seznam nov_element = new Seznam(); nov_element.en = prvotni.en; nov_element.next = obrnjen; temp = nov_element; return obrni(nov_element, prvotni.next); } else return temp; } }
pa še tole ko mam za primerjat če sta dve množici enaki mi sedaj deluje samo če sta obe enak dolgi ali pa d je prvi seznam dalši. Se da naredit brez začetnega ugotavljanja njune dolžine to da bi delalo v vseh primerih.
- spremenilo: snow ()
l0g1t3ch ::
No obračanje seznama sm si drugač zamislu tkole. Maš en začetni povn seznam in pa nov prazen seznam ki bo obrnjen začetni.
Potem preberem iz začetnega seznama prvi element in ga dodam na začetek novega seznama, potem preberem drugi element in ga dodam na začetek noega seznama.
Torej:
začetni seznam 1,2,3,4 preberem prvi element in dodam v novi seznam na začetek, dobim 1
preberem prvi element in dodam v novi seznam na začetek, dobim novi seznam 1
preberem drugi element in dodam v novi seznam na začetek, dobim novi seznam 2,1
preberem tretji element in dodam v novi seznam na začetek, dobim novi seznam 3,2,1
preberem četrti element in dodam v novi seznam na začetek, dobim novi seznam 4,3,2,1
zdej sam to v prakso spravit ker more bit rekurzivno
Potem preberem iz začetnega seznama prvi element in ga dodam na začetek novega seznama, potem preberem drugi element in ga dodam na začetek noega seznama.
Torej:
začetni seznam 1,2,3,4 preberem prvi element in dodam v novi seznam na začetek, dobim 1
preberem prvi element in dodam v novi seznam na začetek, dobim novi seznam 1
preberem drugi element in dodam v novi seznam na začetek, dobim novi seznam 2,1
preberem tretji element in dodam v novi seznam na začetek, dobim novi seznam 3,2,1
preberem četrti element in dodam v novi seznam na začetek, dobim novi seznam 4,3,2,1
zdej sam to v prakso spravit ker more bit rekurzivno
Quikee ::
mogoče kaj takega:
obrniSeznam(Seznam element){
if(element.next != null) {
obrni(element.next)
}
// dodaj element v obrnjen seznam (na konec)
}
obrniSeznam(Seznam element){
if(element.next != null) {
obrni(element.next)
}
// dodaj element v obrnjen seznam (na konec)
}
Quikee ::
ja no dosti lažje bi blo, če bi imel narejeno celoten seznam tako:
class SeznamElement // predstavlja le en element v seznamu.
{
private SeznamElement next;
private int en;
... getter + setter metode, recimo:
public SeznamElement getNext()
{
return next;
}
public void setNext(SeznamElement next)
{
this.next = next;
}
public SeznamElement vrniKopijo() // mogoče lahko tudi kloniraš z clone() metodo, ki je na vseh objektih
{
SeznamElement kopija = new SeznamElement();
kopija.setEn(en); // skopirat(!) moreš vse podatke razen next.
return kopija;
}
}
in potem še en razred Seznam, ki ti v bistvu predstavlja seznam v celoti
class Seznam
{
SeznamElement first;
... vse operacije, ki se dogajajo nad seznamom (dodaj, išči,...)
...
...
...
public void dodajNaZačetek(SeznamElement trenutni)
{
trenutni.setNext(first);
first = trenutni;
}
public void obrni(SeznamElement trenutni, Seznam obrnjen)
{
obrnjen.dodajNaZačetek(trenutni.kopiraj());
if (trenutni.getNext() == null)
{
obrni(trenutni.getNext(), obrnjen);
}
}
public Seznam vrniObrnjenSeznam()
{
Seznam obrnjen = new Seznam();
obrni(first, obrnjen);
return obrnjen;
}
public static void main(String args[]) // v main pač le predstaviš in testiraš, kako se Seznam obnaša
{
}
}
Upam, da ti bo pomagalo vsaj idejno, kako naredit. Možno je tudi da sem se kje zmoto.
class SeznamElement // predstavlja le en element v seznamu.
{
private SeznamElement next;
private int en;
... getter + setter metode, recimo:
public SeznamElement getNext()
{
return next;
}
public void setNext(SeznamElement next)
{
this.next = next;
}
public SeznamElement vrniKopijo() // mogoče lahko tudi kloniraš z clone() metodo, ki je na vseh objektih
{
SeznamElement kopija = new SeznamElement();
kopija.setEn(en); // skopirat(!) moreš vse podatke razen next.
return kopija;
}
}
in potem še en razred Seznam, ki ti v bistvu predstavlja seznam v celoti
class Seznam
{
SeznamElement first;
... vse operacije, ki se dogajajo nad seznamom (dodaj, išči,...)
...
...
...
public void dodajNaZačetek(SeznamElement trenutni)
{
trenutni.setNext(first);
first = trenutni;
}
public void obrni(SeznamElement trenutni, Seznam obrnjen)
{
obrnjen.dodajNaZačetek(trenutni.kopiraj());
if (trenutni.getNext() == null)
{
obrni(trenutni.getNext(), obrnjen);
}
}
public Seznam vrniObrnjenSeznam()
{
Seznam obrnjen = new Seznam();
obrni(first, obrnjen);
return obrnjen;
}
public static void main(String args[]) // v main pač le predstaviš in testiraš, kako se Seznam obnaša
{
}
}
Upam, da ti bo pomagalo vsaj idejno, kako naredit. Možno je tudi da sem se kje zmoto.
Zgodovina sprememb…
- spremenil: Quikee ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] Nov tip shranjevanja slikeOddelek: Programiranje | 2188 (1312) | urosz |
» | Pomoč pri programiranju z javoOddelek: Programiranje | 3549 (2476) | milc |
» | [android] vstavljanje slikeOddelek: Programiranje | 1240 (1137) | messi |
» | [java] Osnovna vprašanjaOddelek: Programiranje | 2625 (1632) | killa bee |
» | [JAVA] zaustavitev niti (threadov)Oddelek: Programiranje | 3174 (3174) | morbo |