SlideShare uma empresa Scribd logo
1 de 39
Estrutura de
Dados
Divani Barbosa
Aula 9 parte 1
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.
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.
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
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
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
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
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
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
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
}
}
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
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
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
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
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;
}
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;
}
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
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
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
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
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
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
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;
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;
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
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;
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;
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;
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
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;
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;
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;
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 ...
// 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 ...
// 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 ...
// 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
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
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)
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.

Mais conteúdo relacionado

Mais procurados

Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadasRicardo Bolanho
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoArthur Xavier
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Tchelinux
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basicoWemerson Silva
 
Código limpo e eficiente com JavaScript
Código limpo e eficiente com JavaScriptCódigo limpo e eficiente com JavaScript
Código limpo e eficiente com JavaScriptRodrigo Vieira
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 

Mais procurados (16)

Slide Semana2 Rodrigo2
Slide Semana2 Rodrigo2Slide Semana2 Rodrigo2
Slide Semana2 Rodrigo2
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
String
StringString
String
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadas
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
Aula 22
Aula 22Aula 22
Aula 22
 
Pged 04
Pged 04Pged 04
Pged 04
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
JAVA - Pacotes
JAVA - PacotesJAVA - Pacotes
JAVA - Pacotes
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Código limpo e eficiente com JavaScript
Código limpo e eficiente com JavaScriptCódigo limpo e eficiente com JavaScript
Código limpo e eficiente com JavaScript
 
Aula 11
Aula 11Aula 11
Aula 11
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Função
FunçãoFunção
Função
 

Semelhante a Estrutura de Lista Encadeada

Semelhante a Estrutura de Lista Encadeada (13)

Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
Lista duplamente encadeada
Lista duplamente encadeadaLista duplamente encadeada
Lista duplamente encadeada
 
Programação-Aula004
Programação-Aula004Programação-Aula004
Programação-Aula004
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem C
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Aula 19
Aula 19Aula 19
Aula 19
 
Aula 8
Aula 8Aula 8
Aula 8
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Pilha
PilhaPilha
Pilha
 
Aula 10
Aula 10 Aula 10
Aula 10
 
Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
 

Mais de Divani Barbosa (11)

Banco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface GraficaBanco de Dados MySQL + NetBeans Java + Interface Grafica
Banco de Dados MySQL + NetBeans Java + Interface Grafica
 
Aula 18
Aula 18Aula 18
Aula 18
 
Aula14
Aula14Aula14
Aula14
 
Aula 9
Aula 9Aula 9
Aula 9
 
Aula 7
Aula 7 Aula 7
Aula 7
 
Aula 6
Aula 6Aula 6
Aula 6
 
Aula 5
Aula 5 Aula 5
Aula 5
 
Aula 4
Aula 4 Aula 4
Aula 4
 
Aula 3
Aula 3Aula 3
Aula 3
 
Aula 2
Aula 2Aula 2
Aula 2
 
Aula 1
Aula 1Aula 1
Aula 1
 

Estrutura de Lista Encadeada

  • 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.