2. Lista
Definição:
Um tipo de estrutura de dados
(conjunto de dados) dispostos e
acessíveis para remoção e inserção de
itens de maneira dinâmica.
Adicionar ou remover itens em
qualquer ponto.
Cada item é alocado na memória de
maneira individual, sendo assim,
pode crescer (aumentar o tamanho)
conforme o limite de memória
disponível pelo sistema operacional.
3. Lista Simplesmente
Encadeada
Fonte: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
Cada elemento possui um
elo (endereço) para o
próximo elemento.
Lista encadeada simples ou simplesmente
ligada.
class No {
public String item;
public No prox;
}
Classe Nós:
espaço para armazenamento da
informação
Um espaço para armazenar uma
referência da localização na
memória onde o próximo
elemento se encontra.
4. Definição Nó em Java:
É uma classe que contém um
item de dados e um ou mais elos
(vínculos).
class No {
public String item;
public No prox;
}
4
Sendo que este vínculo funciona como um ponteiro que aponta
para a posição de outro nó na memoria do computador.
ESTRUTURA DE DADOS DO TIPO LISTA SIMPLESMENTE ENCADEADA
(todos os elementos ou nodos)
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Pera
No
PROX = NULL
item = Maçã
No
PROX = null
item = Caju
primeiro ultimo
5. private No primeiro;
private No ultimo;
Classe ListaSE:
Campos Construtor
public ListaSE() {
primeiro = null;
ultimo = null;
}Métodos
vazio: Retorna verdadeiro se lista vazia.
insere: Insere itens na lista.
insere_fim: Insere itens no final da lista.
pesquisa: Retorna verdadeiro se item
encontrado.
imprime: Imprime lista toda.
apaga: Remove itens.
item_frente: Retorna o primeiro item
6. public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
Caminhando do
inicio para o
fim da lista
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
7. public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
Caminhando do
inicio para o
fim da lista
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
atual
8. public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
atual
Caminhando do
inicio para o
fim da lista
9. public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual = null
Caminhando do
inicio para o
fim da lista
10. INSERE
public void insere(int pos, String valor) {
if (pos < 0) return; // pos = POSIÇÃO DE INSERÇÃO
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
if(pos == 0) { // se na primeira posição
lista.prox = primeiro;
primeiro = lista;
}
else {
No atual = primeiro;
for(int i=1; i < pos && atual.prox != null; i++)
atual = atual.prox; // posicionando no Nó atual
lista.prox = atual.prox;
atual.prox = lista;
if (lista.prox == null) ultimo = lista; // se ultima posição
}
}
11. No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
lista
atual
12. No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
lista.prox = atual.prox;
lista
atual
13. No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
atual.prox = lista;
lista
atual
14. public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
No
PROX= null
item = Alho
primeiro ultimo lista
15. INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo lista
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
16. INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro
ultimo
lista
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
17. Caminhando do
inicio para o
fim da lista
public boolean pesquisa(String chave) {
No atual = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(chave))
return true; // encontrou item
atual = atual.prox; // caminhando
}
return false; // não encontrou item
}
PESQUISA
public boolean vazio() { return (primeiro==null); }
public String item_frente() { return primeiro.item; }
VAZIO e ITEM FRENTE
18. public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando do inicio ao fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox; // caminhando
}
if (atual == null) return;
if (atual == primeiro) {
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) {
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
APAGA
Encontrou item a ser removido
sai do laço while com atual
posicionado nele e anterior
no item anterior ao atual
19. public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando do inicio ao fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual; // posiciona anterior no item anterior ao atual
atual = atual.prox; // caminhando
}
if (atual == null) return; // se não encontrou item sai
if (atual == primeiro) { // se item na primeira posição
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { // se item na última posição
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox; // se item no meio
atual = null;
}
APAGA
20. public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return; // se não encontrou item sai
if (atual == primeiro) {
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) {
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
APAGA
Comandos de posicionamento
dos itens atual e anterior
Comandos responsáveis
por apagar itens
Comando libera item atual da memoria
21. public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return;
if (atual == primeiro) { // se primeiro item
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { // se último item
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox; // se item do meio
atual = null;
}
APAGA
Comando usado nos três casos
22. Se for apagar o primeiro item
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo
atual
anterior
23. Se for apagar o primeiro item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimoatual
anterior
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
24. Se for apagar o primeiro item
atual = null
anterior = null
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
25. Se for apagar o ultimo item
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimo
atual
primeiro anterior
26. Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimo
atualprimeiro anterior
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
27. Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
No
PROX= null
item = Alho
ultimo
atualprimeiro anterior
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
28. Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
ultimo
primeiro anterior
atual = null
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
29. Se for apagar itens do meio
else anterior.prox = atual.prox;
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
30. Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
else anterior.prox = atual.prox;
atual = null;
31. Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
else anterior.prox = atual.prox;
atual = null;
32. Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX= null
item = Alho
ultimoprimeiro anterior
atual = null
else anterior.prox = atual.prox;
atual = null;
33. Implementação Classe
ListaSE
class ListaSE {
private No primeiro; // referencia ao primeiro Nó da lista
private No ultimo; // referencia ao ultimo Nó da lista
public ListaSE() { primeiro=ultimo=null; } // Construtor
public boolean vazio() { return (primeiro==null); }
public String item_frente() { return primeiro.item; }
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
} // Continua ...
34. // Continuação ...
public void insere(int pos, String valor) {
if (pos < 0) return;
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
if(pos == 0) {
lista.prox = primeiro;
primeiro = lista;
}
else {
No atual = primeiro;
for(int i=1; i < pos && atual.prox != null; i++)
atual = atual.prox;
lista.prox = atual.prox;
atual.prox = lista;
if (lista.prox == null) ultimo = lista;
}
}
// Continua ...
35. // Continuação ...
public boolean pesquisa(String chave) {
No atual = primeiro;
while (atual != null) { // caminhando para o fim da lista
if(atual.item.equalsIgnoreCase(chave)) return true;
atual = atual.prox;
}
return false;
}
public void imprime() {
No atual = primeiro;
while (atual != null) { // caminhando para o fim da lista
System.out.print("{" + atual.item + "} ");
atual = atual.prox;
}
System.out.println("");
}
// Continua ...
36. // Continuação ...
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando para o fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return;
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
} // fim da classe ListaSE
37. Exemplo de uso da Classe ListaSE
class ListaSEApp {
public static void main (String[] args) {
ListaSE l = new ListaSE();
System.out.println(">>> Adicionando ARROZ, FEIJAO, ALFACE no fim");
l.insere_fim("ARROZ"); l.insere_fim("FEIJAO");
l.insere_fim("ALFACE");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Adiciona FILE DE FRANGO na posição 1");
l.insere(1,"FILE DE FRANGO");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Adiciona TOMATE na posição 3");
l.insere(3,"TOMATE");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Removendo FEIJAO");
l.apaga("FEIJAO");
System.out.println(">>> Removendo todos itens do inicio ao fim:");
while (!l.vazio()) { // Enquanto lista não estiver vazia
System.out.println(" Removido {" + l.item_frente() + "}");
l.apaga(l.item_frente());
}
} // fim programa principal
} // fim classe ListaSEApp
38. Tabela de Estruturas de
Armazenamento
de Propósito Geral
Inserção Eliminação Pesquisa
Vetor O(1) O(n) O(n)
Vetor
Ordenado
O(n) O(n) O(log n)
Lista
Simplesmente
Encadeada
O(1)
fim
O(n)
posição
O(n) O(n)
39. Atividade
Trabalho 2 - Exercício 3. Reescreva os métodos de
inserção de itens da classe Lista Simplesmente
Encadeada de Strings para que os mesmos não
permitam a inserção de itens já existentes na
lista.
2. Escreva um método para classe Lista Simplesmente
Encadeada que retorne o ultimo item.
3. Escreva um método para classe Lista Simplesmente
Encadeada que remova o ultimo item, chame-o de
remove_ultimo.