Tenho uma dúvida bem básica!
Mas ta complicadinha pra mim.
Preciso fazer uma lista de adjacência. Mas a minha dúvida, seria em como fazer um vetor, e depois, ter valores de uma lista em algum número desse vetor.
Por exemplo: um vetor de 10 posições; cada posição terá uma lista encadeada (acho que quem sabe lista adjacencia vai entender bem que é essa ideia que to passando)
vetor1-> lista com numeros 1-> 2 3
vetor2-> … 2-> 1
vetor3-> 3->2
…
Como faço pra fazer um vetor com essas listas em java?
Não achei a dúvida tão básica, mas acho que dá para resolver da seguinte forma:
A classe abaixo eu peguei da implementação em Java de uma Lista Ligada, que tem na Wikipedia. Só acrescentei o método listar.
classNo{Objectelemento;Noprox;No(Objectelem){elemento=elem;prox=null;}}publicclassListaLigada{privateNoprimeiro,ultimo;privateintnroNos;ListaLigada(){primeiro=null;ultimo=null;nroNos=0;}publicbooleanisVazia(){return(primeiro==null&&ultimo==null);}publicvoidaddInicio(Objecto){nroNos++;NonovoNo=newNo(o);if(isVazia())ultimo=novoNo;elsenovoNo.prox=primeiro;primeiro=novoNo;}publicvoidaddFinal(Objecto){nroNos++;NonovoNo=newNo(o);if(isVazia())primeiro=novoNo;elseultimo.prox=novoNo;ultimo=novoNo;}publicintgetNroNos(){returnnroNos;}/* * @param posicao * posição contada a partir do zero como primeiro elemento */publicvoidaddMeio(Objecto,intposicao){nroNos++;NonovoNo=newNo(o);if(posicao<=1){addInicio(novoNo);return;}if(posicao>nroNos){//Outra abordagem seria lançar exceção para posição inválida (>nroNos+1) addFinal(novoNo);return;}NonoTemp=primeiro.prox;for(intposAux=1;posAux<posicao;posAux++)noTemp=noTemp.prox;novoNo.prox=(noTemp.prox).prox;noTemp.prox=novoNo;}publicvoidRemover(Objectelemento){NonoTemp=primeiro;NonoAnt=null;if(primeiro.elemento.equals(elemento)){primeiro=primeiro.prox;nroNos--;}else{while(noTemp!=null&&!noTemp.elemento.equals(elemento)){noAnt=noTemp;noTemp=noTemp.prox;}if(noTemp!=null){noAnt.prox=noTemp.prox;nroNos--;}if(noTemp==ultimo){ultimo=noAnt;}}}publicObjectBuscarElemento(Objectelemento){inti=1;NonoTemp=primeiro;while(noTemp!=null){if(noTemp.elemento.equals(elemento)){returnnoTemp;}i=i+1;noTemp=noTemp.prox;}returnnull;}publicvoidlistar(){NonoTemp=primeiro;while(noTemp!=null){System.out.println(noTemp.elemento.toString());noTemp=noTemp.prox;}}}
E a lista de adjacência seria um vetor de listas ligadas:
publicclassListaAdjacencia{publicstaticvoidmain(Stringargs[]){//crio o vetor com 11 posicoes porque vou desprezar a posicao 0ListaLigada[]listaAdjacencia=newListaLigada[11];//inicializo as listas ligadasfor(inti=1;i<=10;i++){listaAdjacencia[i]=newListaLigada();}//adiciona elementos na lista ligada da primeira posicao do vetorlistaAdjacencia[1].addFinal(2);listaAdjacencia[1].addFinal(5);//adiciona elementos na lista ligada da segunda posicao do vetorlistaAdjacencia[2].addFinal(1);listaAdjacencia[2].addFinal(3);listaAdjacencia[2].addFinal(5);System.out.println("Lista encadeada no primeiro elemento do vetor:");listaAdjacencia[1].listar();System.out.println("Lista encadeada no segundo elemento do vetor:");listaAdjacencia[2].listar();}}
al.barbosa
marinagtto,
A implementação acima é bem básica.
Você pode obter implementações mais completas de algoritmos de grafo em Java no site abaixo: