Você está aqui: Java ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Listas Ligadas |
Como inserir um nó em qualquer posição de uma lista duplamente encadeada em Java - Escreva um programa Java que - Exercícios Resolvidos de JavaQuantidade de visualizações: 686 vezes |
Pergunta/Tarefa: Escreva um programa Java que cria uma lista dinâmica duplamente ligada (lista duplamente encadeada) e peça para o usuário inserir 5 elementos do tipo inteiro. Em seguida peça para o usuário informar um índice e um novo elemento e insira tal elemento no índice informado. Finalmente faça a varredura da lista e mostre os elementos, antes e depois da nova inserção. Faça a validação dos índices para que ele não saia da faixa permitida. Sua saída deve ser parecida com: Inserindo na lista duplamente encadeada Informe o 1.o valor: 6 Informe o 2.o valor: 9 Informe o 3.o valor: 1 Informe o 4.o valor: 3 Informe o 5.o valor: 7 Valores na lista duplamente encadeada: 6 9 1 3 7 Inserindo um elemento no índice k Informe o índice desejado: 2 Informe o valor do nó: 4 Valores na lista duplamente ligada: 6 9 4 1 3 7 Na saída podemos ver que o índice 2 corresponde ao terceiro elemento da lista duplamente encadeada. Por isso o valor 1 foi empurrado para a frente para abrir espaço para o valor 4. Se o índice 0 fosse informado, o número 6 seria empurrado para a frente e o nó com valor 4 passaria a ser o início da lista duplamente ligada. Veja a resolução comentada deste exercício usando Java: ---------------------------------------------------------------------- Precisa de ajuda? Chama no WhatsApp +55 (62) 98553-6711 (Osmar) Este código foi útil? Paga um cafezinho pra mim :-( PIX: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- package estudos; import java.util.Scanner; // classe interna para representar os nós da // lista duplamente encadeada class No { int valor; // valor armazenado no nó No anterior; // aponta para o nó anterior No proximo; // aponta para o próximo nó // construtor do nó public No(int valor){ this.valor = valor; this.anterior = null; this.proximo = null; } } public class Estudos { // referência para o início da lista duplamente ligada static No inicio; // referência para o final da lista duplamente ligada static No fim; public static void main(String args[]){ // para ler a entrada do usuário Scanner entrada = new Scanner(System.in); // vamos inserir 5 valores inteiros na lista // duplamente ligada int valor; System.out.println("Inserindo na lista duplamente encadeada\n"); for (int i = 0; i < 5; i++) { System.out.print("Informe o " + (i + 1) + ".o valor: "); valor = Integer.parseInt(entrada.nextLine()); // vamos inserir este valor no final da lista // duplamente encadeada inserirFinal(valor); } // vamos exibir os valores na lista ligada System.out.print("\nValores na lista duplamente encadeada: "); exibirLista(); // vamos inserir um novo elemento no índice informado System.out.println("\nInserindo um elemento no índice k\n"); System.out.print("Informe o índice desejado: "); int indice = Integer.parseInt(entrada.nextLine()); // o índice é válido? if ((indice < 0) || (indice > tamanhoLista() - 1)) { System.out.println("O índice é inválido."); } else { // vamos inserir o novo nó no índice indicado System.out.print("Informe o valor do nó: "); valor = Integer.parseInt(entrada.nextLine()); inserirIndice(indice, valor); // vamos exibir os valores na lista ligada System.out.print("\nValores na lista duplamente ligada: "); exibirLista(); } } // função que permite inserir um novo nó em // índice informado pelo usuário public static void inserirIndice(int indice, int valor) { // o primeiro passo é construir um novo nó No novo = new No(valor); novo.anterior = null; // não possui nó anterior novo.proximo = null; // não possui nó próximo // temos que inserir no início da lista? if (indice == 0) { // a lista ainda está vazia? if (inicio == null) { // tanto o início quanto o fim da lista // apontam para o novo nó inicio = novo; fim = novo; } else { // a lista duplamente ligada possui um ou mais nós. // vamos inserir no início, antes deles // o campo proximo do novo nó aponta para o // início da lista novo.proximo = inicio; // o campo anterior do início da lista aponta // para o novo nó inicio.anterior = novo; // e finalmente o início da lista aponta para o // novo nó inicio = novo; } } else { // vamos inserir no índice específicado, talvez no // meio ou um nó antes do final da lista // duplamente encadeada // primeiro apontamos para o início da lista No temp = inicio; // encontramos o índice desejado. Note que paramos // um nó antes da posição a ser inserida for (int i = 1; i < indice; i++) { temp = temp.proximo; } // agora que paramos um nó antes da posição que vamos // inserir, o campo proximo do novo nó aponta para // o proximo do nó temporário novo.proximo = temp.proximo; // o campo anterior do novo nó aponta para o // nó temporário novo.anterior = temp; // o campo anterior do nó à frente do novo nó // aponta para ele (o novo nó) novo.proximo.anterior = novo; // e o próximo do nó temporário aponta para // o novo nó temp.proximo = novo; } } // esta função permite inserir um novo nó no // final de uma lista duplamente encadeada public static void inserirFinal(int valor) { // o primeiro passo é construir um novo nó No novo = new No(valor); novo.anterior = null; // não possui nó anterior novo.proximo = null; // não possui nó próximo // a lista ainda está vazia? if (inicio == null) { // tanto o início quanto o fim da lista // apontam para o novo nó inicio = novo; fim = novo; } else { // o campo anterior do novo nó aponta para o // final da lista novo.anterior = fim; // o campo proximo do final da lista aponta // para o novo nó fim.proximo = novo; // finalmente o fim da lista aponta para // o novo nó fim = novo; } } // esta função permite exibir os valores de todos // os nós da lista duplamente encadeada public static void exibirLista() { // apontamos para o início da lista No temp = inicio; // a lista está vazia? if (inicio == null) { System.out.println("A lista está vazia"); return; } // enquanto temp for diferente de null while(temp != null) { // mostramos o valor do nó atual System.out.print(temp.valor + " "); // e pulamos para o nó seguinte temp = temp.proximo; } } // esta função permite retornar a quantidade // de nós na lista duplamente encadeada public static int tamanhoLista() { // para retornar a quantidade de nós int quantidade = 0; // apontamos para o início da lista No temp = inicio; // a lista está vazia? if (inicio == null) { return 0; } // enquanto temp for diferente de null while(temp != null) { // aumentamos a quantidade quantidade++; // e pulamos para o nó seguinte temp = temp.proximo; } // retorna o tamanho da lista duplamente encadeada return quantidade; } } |
![]() |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |