Ajuda se você postar o erro. Especialmente a parte que diz em qual linha tá dando o erro, mas parece-me que lista.cauda() na linha 7 está retornando nulo. Posta essa classe Lista ou pelo menos o método cauda().
[code] class Lista{
private int cabeça;
private Lista cauda;
Lista(int cabeça, Lista cauda){
this.cabeça = cabeça;
this.cauda = cauda;
}
public int cabeça (){
return cabeça;
}
public Lista cauda (){
return cauda;
}
public static Lista construir(int cabeça, Lista cauda){
return new Lista(cabeça, cauda);
}
public static void mostrar (Lista lista){
if (lista == null)
return;
else{
System.out.println(lista.cabeça());
mostrar(lista.cauda());
}
}
public static Lista ordemCres(Lista lista){
if (lista == null)
return null;
else{
if(lista.cabeça() <= lista.cauda().cabeça()){
return lista;
}
else
return ordemCres(lista.cauda());
}
}
public static void main (String args[]){
Lista lista = construir(1,null);
lista = construir(5,lista);
lista = construir(8,lista);
lista = construir(9,lista);
ordemCres(lista);
System.out.println("");
mostrar(lista);
}
Exception in thread "main" java.lang.NullPointerException
[i]at programa.ordemCres(programa.java:27)
at programa.ordemCres(programa.java:32)
at programa.ordemCres(programa.java:32)
at programa.ordemCres(programa.java:32)
at programa.main(programa.java:43)
Tem que tomar muito cuidado com esse tipo de construção:
lista.cauda().cabeça()
embora seja suscinto, há o risco de null pointer exception caso a primeira chamada retorne nulo. Assim, você só deve usar esse tipo de construção quando tiver certeza absoluta que não será retornado o valor null na primeira chamada.
Você cria uma variável cauda e não a reusa nas linhas 8 e 11;
comparação redundante na linha 7:lista.cabeça() <= lista.cabeça()Ou seja, com essas modificações e seguindo a lógica da versão inicial, ele poderia ficar assim:
[code] public static Lista ordemCres(Lista lista) {
if (lista == null) {
return null;
}
Lista cauda = lista.cauda();
if (cauda != null && lista.cabeça() <= cauda.cabeça()) {
return cauda;
}
return ordemCres(cauda);
}
[/code]E, fra, tudo o que esse método faz é percorrer a lista até achar uma cauda maior ou igual a cabeça ou nula e retorná-la. Pelo nome, imagino que você queria ordená-la.
Mais uma coisa. Estudo os padrões java:
Use “Programa” e não “programa” para nome de classe;
Não use “ç”, coloque “cabeca” mesmo.
Por fim, parabéns pela iniciativa de tentar fazer o exercício sozinho, ao contrário de muitos que entram aqui pra pedir tudo de mão beijada.
dica: Depois de fazer sua própria estrutura da lista encadeada, dê uma olhada no código da LinkedList do java, que é uma lista circular duplamente encadeada.
Valeu ozix pelas dicas. Tambem ja havia percebido q não tava fazendo totalmente o q eu queria.
O objetivo do exercio é verificar através de métodos recursivos se uma lista está em ordem crescente.
Pensei em fazer uma classe do tipo boolean, mas não deu muito certo.
Mais um favorzinho vc sabe onde possso aprender mais sobre algoritmos recursivos, pois não mando muito bem
Flw