• Nenhum resultado encontrado

TÓPICO 1 – LISTAS ENCADEADAS

2.5 CÓDIGO COMPLETO DA CLASSE LISTA ENCADEADA

Disponibilizamos a seguir o código completo da classe Lista Encadeada.

Ao executar a classe acima, teremos como saída esperada:

[Guilherme, Felipe]

FIGURA 120 - COMPLETO DA CLASSE LISTA ENCADEADA

package exemplo;

public class ListaEncadeada { private No primeiro;

private No ultimo;

private int totalDeElementos;

private Object elemento;

public void adicionaNoComeco(Object elemento) { No novo = new No (this.primeiro, elemento);

this.primeiro = novo;

if (this.totalDeElementos == 0) { //caso especial da lista vazia this.ultimo = this.primeiro;

} this.totalDeElementos++;

}

public void adiciona(Object elemento) { if (this.totalDeElementos == 0) {

this.adicionaNoComeco(elemento);

public void adicionaPosicao(int posicao, Object elemento) { if(posicao == 0){ // No começo.

this.adicionaNoComeco(elemento);

} else if(posicao == this.totalDeElementos){ // No fim.

this.adiciona(elemento);

} else {

No anterior = this.pegaNo(posicao - 1);

No novo = new No(anterior.getProximo(), elemento);

throw new IllegalArgumentException("Posição não existe");

No anterior = this.pegaNo(posicao - 1);

No atual = anterior.getProximo();

} }

if (atual.getElemento().equals(elemento)) { return true;

throw new IllegalArgumentException("Posição não existe");

} this.primeiro = this.primeiro.getProximo();

this.totalDeElementos--;

if (this.totalDeElementos == 0) { this.ultimo = null;

} }

public void removeDoFim() {

if (!this.posicaoOcupada(this.totalDeElementos - 1)) { throw new IllegalArgumentException("Posição não existe");

this.ultimo = penultima;

this.totalDeElementos--;

} }

private boolean posicaoOcupada(int posicao){

return posicao >= 0 && posicao < this.totalDeElementos;

}

private No pegaNo(int posicao) {

if(!this.posicaoOcupada(posicao)){

throw new IllegalArgumentException("Posição não existe");

}No atual = primeiro;

for (int i = 0; i < posicao; i++) { atual = atual.getProximo();

} return atual;

}

public No getPrimeiro() { return primeiro;

}

public void setPrimeiro(No primeiro) { this.primeiro = primeiro;

}

public No getUltimo() { return ultimo;

}

public void setUltimo(No ultimo) { this.ultimo = ultimo;

}

public int getTotalDeElementos() { return totalDeElementos;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

No temp = primeiro;

for(int i = 0; i< this.totalDeElementos;i++){

sb.append(temp.getElemento()+" ");

temp = temp.getProximo();

} return sb.toString();

}

public Object getElemento() { return elemento;

}

public void setElemento(Object elemento) { this.elemento = elemento;

} }

FONTE: O autor

Neste tópico vimos que:

• As estruturas de dados dinâmicas podem crescer e encolher durante a execução.

• As listas encadeadas são coleções de itens de dados “colocados em fila”, sendo que as inserções e exclusões podem ser feitas em qualquer lugar da lista em uma lista encadeada.

• A classe autorreferencial contém uma referência para outro objeto do mesmo tipo de classe. Os objetos autorreferenciais podem ser encadeados entre si para formar estruturas de dados úteis, como listas, filas e pilhas.

• Criar e manter estruturas de dados dinâmicas exige alocação dinâmica de memória – a capacidade de um programa obter mais espaço de memória durante a execução para armazenar novos nós e liberar espaço não mais necessário.

• O limite para alocação dinâmica pode ser tão grande quanto à memória física disponível no computador ou a quantidade de espaço em disco disponível em um sistema de memória virtual. Frequentemente os limites são muito menores, porque a memória disponível no computador deve ser compartilhada entre muitos usuários.

• O operador new recebe como operando o tipo do objeto que está sendo dinamicamente alocado e devolve uma referência a um objeto desse tipo recém-criado.

• A lista encadeada é uma coleção linear (isto é, uma sequência) de objetos de classe autorreferecial, denominados nós, conectados por ponteiros de referência.

• A lista encadeada é acessada através de uma referência ao primeiro nó da lista.

Cada nó subsequente é acessado através do membro de referência de ponteiro armazenado no nó anterior.

• Por convenção, a referência de ponteiro do último nó de uma lista é configurada como null para marcar o fim da lista.

• O nó pode conter dados de qualquer tipo, incluindo objetos de outras classes.

RESUMO DO TÓPICO 1

1 Desenvolva um programa que possibilite a inserção de 25 valores do tipo inteiro aleatórios de 0 a 100 em ordem em um objeto de lista encadeada. Ao final o programa deverá calcular a soma dos elementos e a média em ponto flutuante dos elementos.

2 Desenvolva um programa que crie um objeto de lista encadeada de 10 caracteres e depois cria um segundo objeto de lista que contém uma cópia da primeira lista, mas na ordem inversa e exiba os dados ao usuário.

AUTOATIVIDADE

TÓPICO 2

LISTA DUPLAMENTE ENCADEADA

UNIDADE 3

1 INTRODUÇÃO

Para o método responsável por remover o elemento do fim da Lista ter consumo de tempo constante, o último nó deve se referir ao penúltimo. Isso é possível se utilizarmos o esquema de Lista Duplamente Encadeada, no qual os nós possuem referências tanto para a próxima, quanto para o nó anterior (CAELUM, 2014).

Está modificação implica alterações na implementação dos outros métodos, como já falamos anteriormente, as quais serão vistas a seguir. Para realizar estas mudanças, iremos criar uma nova classe, a qual chamaremos de ListaDuplamenteEncadeada e posteriormente copiaremos todos os métodos já definidos na classe ListaEncadeada a fim de agilizar nosso trabalho.

2 MÉTODO ADICIONANOCOMECO()

Para este método devemos considerar dois casos: Lista Vazia e Lista não Vazia, sendo que para o primeiro caso o novo nó será o primeiro e o último. Além disso, ele não terá próximo nem anterior, pois será o único nó.

Já no caso da Lista não encontrar-se vazia, será necessário ajustar os ponteiros para o novo segundo (antiga referência primeiro) apontar para o novo primeiro e vice-versa.

FIGURA 121 – ADICIONA NO COMEÇO – LISTA DUPLAMENTE ENCADEADA VAZIA

FONTE: O autor

FONTE: O autor

FIGURA 122 – ADICIONA NO COMEÇO – LISTA DUPLAMENTE ENCADEADA NÃO VAZIA

FIGURA 123 – CÓDIGO PARA ADICIONAR NO COMEÇO DA LISTA DUPLAMENTE ENCADEADA

primeiro primeiro

null null

Lista vazia

último

Guilherme

último

primeiro primeiro

Lista não vazia

Guilherme Felipe Guilherme

As setas entre os nós indicam a referência para o próximo e anterior

3 MÉTODO ADICIONA()

Ao utilizar o método adiciona(), a pessoa será adicionada no último nó da lista. No caso em que a Lista está vazia, adicionar no fim é a mesma coisa que adicionar no começo. Agora, caso a Lista não esteja vazia então devemos ajustar as referências de tal forma que o novo último nó aponte para o novo penúltimo (antigo último) e vice-versa.

FONTE: O autor

FONTE: O autor

FIGURA 124 – ADICIONA NO FIM – LISTA DUPLAMENTE ENCADEADA NÃO VAZIA

FIGURA 125 – CÓDIGO PARA ADICIONAR NO FIM DA LISTA DUPLAMENTE ENCADEADA

último último

Lista não vazia

Guilherme

Guilherme Felipe

As setas entre os nós indicam a referência para o próximo e anterior

4 MÉTODO ADICIONAPOSICAO()

Separamos os casos em que a inserção é no começo ou no fim porque podemos reaproveitar os métodos já implementados.

Resta a situação em que a inserção é no meio da Lista, ou seja, entre dois nós existentes. Neste caso, devemos ajustar as referências para o novo nó ser apontado corretamente pelos dois nós relacionados a ele (o anterior e o próximo).

E também fazer o novo nó apontar para o anterior e o próximo (Caelum, 2014).

Para tanto, precisaremos utilizar os métodos pegaNo e posicaoOcupada, os quais já foram definidos na classe ListaEncadeada e serão reaproveitados em sua íntegra, sem sofrer qualquer alteração.

FONTE: O autor

5 MÉTODO REMOVEDOCOMECO()

“Esta operação é idêntica em ambos os tipos de Lista Encadeada (simples ou dupla). Ela apenas deve avançar a referência primeira para o segundo nó e tomar cuidado com o caso da Lista ficar vazia, pois, neste caso, a referência último deve ser atualizada também” (CAELUM, 2014, p. 34).

FIGURA 126 – CÓDIGO PARA ADICIONAR EM UMA POSIÇÃO DA LISTA DUPLAMENTE ENCADEADA

FIGURA 127 – REMOVE DO COMEÇO – LISTA DUPLAMENTE ENCADEADA COM APENAS UM ELEMENTO

FONTE: O autor (2014)

FONTE: O autor

6 MÉTODOS REMOVEDOFIM() E REMOVE()

Estes dois métodos já foram tratados e implementados anteriormente usando o esquema de Lista Duplamente Encadeada.

FIGURA 128 – REMOVE DO COMEÇO – LISTA DUPLAMENTE ENCADEADA COM PELO MENOS DOIS ELEMENTOS

Guilherme

Lista com apenas um elemento

primeiro primeiro

null null

último último

Lista com pelo menos 2 elementos

primeiro primeiro

Guilherme Felipe Felipe

As setas entre os nós indicam a referência para o próximo e anterior

FIGURA 49 – REMOVE DO FIM – LISTA DUPLAMENTE ENCADEADA

FONTE: O autor

FONTE: O autor

FIGURA 130 – REMOVE DO INTERIOR DA LISTA DUPLAMENTE ENCADEADA

Dentro da biblioteca da linguagem Java dispomos da classe LinkedList, a qual faz o papel da nossa Lista Encadeada, possuindo os mesmos métodos que a ArrayList,

UNI

Lista com pelo menos 2 elementos

último último

Guilherme Felipe Guilherme

Guilherme Felipe Letícia Guilherme Letícia

Lista com pelo menos 3 elementos

As setas entre os nós indicam a referência para o próximo e anterior