» »

[JAVA] rekurzivno obračanje seznama

[JAVA] rekurzivno obračanje seznama

l0g1t3ch ::

Se da komu pogledat in popravit metodo, ki naj bi rekurzivno obrnila seznam.


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 :8) 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)
}

l0g1t3ch ::

Ja nekaj takega, sam kaj ko mi ne rata spravit v prakso :'(

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.

Zgodovina sprememb…

  • spremenil: Quikee ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142188 (1312) urosz
»

Pomoč pri programiranju z javo

Oddelek: Programiranje
203549 (2476) milc
»

[android] vstavljanje slike

Oddelek: Programiranje
71240 (1137) messi
»

[java] Osnovna vprašanja

Oddelek: Programiranje
372625 (1632) killa bee
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223174 (3174) morbo

Več podobnih tem