Devo fare questo esercizio:
"Scrivere un metodo statico in Java, che data in input una lista ordinata
semplicemente concatenata con chiavi ripetute, restituisca la lista delle
chiavi col massimo numero di occorrenze."
Esempio:
Lista di input: < 1 1 2 3 4 4 5 6 7 7 >
La lista di output sarà quella formata da i numeri con occorrenza maggiore,
in questo caso: < 1 4 7 > che hanno occorrenza 2.
Tutto bene, ho relizzato il codice, ma ho un problema, non riesco a scorrere
la lista fino alla fine, quindi non considero l'ultimo elemento della lista
stessa.
Questo è il codice che ho realizzato:
class esercizio1
{
public static void main(String[] args)
{
lista lista1= new lista();
int comodo=0;
for (int i=0; i<10; i++)
{
comodo+=(int)(Math.random()*2);
lista1.insertTail(comodo);
}
System.out.println(lista1);
System.out.println(listaConOccorrenze(lista1));
}
// NB: il metodo getNext() della classe nodo restituisce il nodo successivo,
il metodo insertTail() della classe lista inserisce in coda l'elemento
specificato come parametro.
public static lista listaConOccorrenze(lista l1)
{
lista l2=new lista(); //creo la nuova lista che restituirò alla fine
nodo aux=l1.head; //dichiaro e setto il nodo aux come testa della lista
di input
nodo temp=null; //dichiaro e setto il nodo temp a null
int cont=1; //conterrà il numero di occorrenze delle
informazioni ripetute
int max=0; //conterrà il massimo numero di occorrenze
for(; aux.getNext()!=null; aux=aux.getNext()) //scorro la lista
{
temp=aux.getNext(); //setto il nodo come successivo del nodo aux
for (cont=1; aux.getInfo()==temp.getInfo() && temp.getNext()!=null;
aux=aux.getNext(), temp=temp.getNext(), cont++);
//questo ciclo controlla che le informazioni dei nodi siano uguali, ed
esce quando sono diverse, nel frattempo incrementa il contatore cont.
if (cont==max)
{ l2.insertTail(aux.getInfo()); } //se cont = max inserisco in coda a l2
l'informazione del nodo corrente
else if (cont>max) //altrimenti...se cont > max
{ l2.head=null; l2.insertTail(aux.getInfo()); max=cont; }//...svuoto la
lista ed inserisco l'informazione del nodo corrente nella lista l2, settando
il nuovo max = a cont
}
return l2; //restituisco la lista di output
}
}
Il problema è che nel primo ciclo dovrei fare un aux!=null anzichè un
aux.getNext()!=null, ma non posso perchè mi da una eccezione, probabilmento
perchè all'interno del ciclo stesso faccio un aux=aux.getNext();
Suggerimenti? Grazie.
Ho ripulito il codice dai commenti, eccolo:
class esercizio1
{
public static void main(String[] args)
{
lista lista1= new lista();
int comodo=0;
for (int i=0; i<10; i++)
{
comodo+=(int)(Math.random()*2);
lista1.insertTail(comodo);
}
System.out.println(lista1);
System.out.println(listaConOccorrenze(lista1));
}
public static lista listaConOccorrenze(lista l1)
{
lista l2=new lista();
nodo aux=l1.head;
nodo temp=null;
int cont=1;
int max=0;
for(; aux.getNext()!=null; aux=aux.getNext())
{
temp=aux.getNext();
for (cont=1; aux.getInfo()==temp.getInfo() && temp.getNext()!=null;
aux=aux.getNext(), temp=temp.getNext(), cont++);
if (cont==max)
{ l2.insertTail(aux.getInfo()); }
else if (cont>max)
{ l2.head=null; l2.insertTail(aux.getInfo()); max=cont; }
}
return l2;
}
}