![]() |
|
||||
Planilha Web - Planilhas e Calculadoras online para estudantes e profissionais de Engenharia Civil, Engenharia Elétrica e Engenharia Mecânica. |
|||||
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: 777 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: ----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------
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 |
|
Java - Como remover um elemento de uma determinada posição do ArrayList do Java usando o método remove() |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |






