Вы находитесь на странице: 1из 9

Listas Lineares

 Conforme já vimos, uma lista é uma


ALGESD 08 coleção de elementos do mesmo tipo
dispostos linearmente que podem ou não
Listas Encadeadas seguir uma determinada organização.
 Exemplo: [E1, E2, E3, E4, E5, ..., En], onde n
Prof. Dr. Marcelo Duduchi deve ser > = 0;
 Até aqui usamos alocação seqüencial
para implementá-las mas a partir de agora
usaremos a alocação encadeada.

Listas Encadeadas Listas Encadeadas Simples


 Listas encadeadas são listas lineares em que os  Cada elemento (nodo) da lista será
elementos não necessariamente encontram-se
dispostos numa área continua de memória;
formado pelo dado (data) a armazenar e
 Como não se encontram numa área continua de uma referência (link) para o próximo:
memória é necessário ter alguma forma de
Nodo:
relacioná-los entre sí;
 A forma utilizada para relacioná-los é incluir em
cada elemento, além do valor armazenado uma
referência de onde está o próximo elemento da
lista;
data link

Listas Encadeadas Simples Listas Encadeadas Simples


 Uma lista encadeada será formada então por  Em Java é necessário, antes de tudo, criarmos
diversos “nodos” inter relacionados por links e a classe Nodo composta por uma ou mais
acessada a partir de uma referência inicial: áreas de dados (data) que no exemplo é do tipo
char e uma área que referencie o próximo (link):
Referência inicial
Nodo:
public class Nodo {
C A D E
char data;
Nodo link;
Lista encadeada } data link
auto referência
Listas Encadeadas Simples Listas Encadeadas Simples
Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Para criar uma lista como a lista.data = ‘C’;  Vejamos a execução lista.data = ‘C’;
abaixo poderíamos usar o
seguinte conjunto de
lista.link = new Nodo(); passo a passo: lista.link = new Nodo();
instruções em Java: lista.link.data = ‘A’; lista.link.data = ‘A’;
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
aux.link = new Nodo(); aux.link = new Nodo();
lista aux.link.data = ‘E’; aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
lista.link.link = aux; lista.link.link = aux;

C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Criando a referência lista.data = ‘C’;  Criando o primeiro lista.data = ‘C’;
lista... lista.link = new Nodo(); nodo e atribuindo sua lista.link = new Nodo();
lista.link.data = ‘A’; referência à lista... lista.link.data = ‘A’;
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
aux.link = new Nodo(); aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
lista.link.link = aux; lista.link.link = aux;

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Colocando o valor ‘C’ lista.data = ‘C’;  Criando o segundo lista.data = ‘C’;
na parte data da área lista.link = new Nodo(); nodo e atribuindo sua lista.link = new Nodo();
referenciada por lista... lista.link.data = ‘A’; referência à lista.link... lista.link.data = ‘A’;
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
aux.link = new Nodo(); aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
lista.link.link = aux; lista.link.link = aux;

C C
Listas Encadeadas Simples Listas Encadeadas Simples
Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Colocando o valor ‘A’ lista.data = ‘C’;  Criando uma lista.data = ‘C’;
na parte data da área lista.link = new Nodo(); referência auxiliar para lista.link = new Nodo();
referenciada por lista.link.data = ‘A’;
ajudar na criação da lista.link.data = ‘A’;
lista.link ... lista...
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
Referência
aux.link = new Nodo(); auxiliar
aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
aux
lista.link.link = aux; lista.link.link = aux;

C A C A

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Cria um novo nodo e lista.data = ‘C’;  Colocando o valor ‘D’ lista.data = ‘C’;
coloca sua referência lista.link = new Nodo(); na parte data da área lista.link = new Nodo();
na área auxiliar lista.link.data = ‘A’; lista.link.data = ‘A’;
criada... referenciada por aux...
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
Referência Referência
auxiliar
aux.link = new Nodo(); auxiliar
aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
aux aux
lista.link.link = aux; lista.link.link = aux;

C A C A D

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Criando um novo nodo e lista.data = ‘C’;  Colocando o valor ‘E’ lista.data = ‘C’;
colocando sua referência
lista.link = new Nodo(); na parte data da área lista.link = new Nodo();
na parte link da área
lista.link.data = ‘A’;
referenciada por lista.link.data = ‘A’;
referenciada por aux... aux.link ...
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
Referência Referência
auxiliar
aux.link = new Nodo(); auxiliar
aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
aux aux
lista.link.link = aux; lista.link.link = aux;

C A D C A D E
Listas Encadeadas Simples Listas Encadeadas Simples
Nodo lista = new Nodo(); Nodo lista = new Nodo();
 Colocando nulo (null) lista.data = ‘C’;  Ligando as duas listas ao lista.data = ‘C’;
na parte link da área lista.link = new Nodo();
colocar o conteúdo de aux
lista.link = new Nodo();
referenciada por lista.link.data = ‘A’;
na parte link da área
lista.link.data = ‘A’;
aux.link... referenciada por lista.link...
Nodo aux = new Nodo(); Nodo aux = new Nodo();
aux.data = ‘D’; aux.data = ‘D’;
Referência Referência
auxiliar
aux.link = new Nodo(); auxiliar
aux.link = new Nodo();
lista aux.link.data = ‘E’; lista aux.link.data = ‘E’;
aux.link.link = null; aux.link.link = null;
aux aux
lista.link.link = aux; lista.link.link = aux;

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


 Note que seria muito fácil  Note que seria muito fácil
fazer um código que Nodo aux2 = new Nodo(); fazer um código que Nodo aux2 = new Nodo();
// cria referência aux2 e o novo nodo // cria referência aux2 e o novo nodo
permite incluir o elemento permite incluir o elemento
aux2.data = ‘G’; aux2.data = ‘G’;
‘G’ no início da lista: // coloca ‘G’ no data do novo nodo
‘G’ no início da lista: // coloca ‘G’ no data do novo nodo
Referência aux2 aux2.link = lista; aux2.link = lista;
auxiliar // coloca referência da lista no link // coloca referência da lista no link
// do novo nodo // do novo nodo
lista lista = aux2; lista lista = aux2;
// faz lista referenciar o novo nodo // faz lista referenciar o novo nodo
G G

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


 O primeiro passo: Nodo aux2 = new Nodo();  Mais um passo: Nodo aux2 = new Nodo();
// cria referência aux2 e o novo nodo // cria referência aux2 e o novo nodo
aux2.data = ‘G’; aux2.data = ‘G’;
// coloca ‘G’ no data do novo nodo // coloca ‘G’ no data do novo nodo
Referência aux2 aux2.link = lista; Referência aux2 aux2.link = lista;
auxiliar // coloca referência da lista no link auxiliar // coloca referência da lista no link
// do novo nodo // do novo nodo
lista lista = aux2; lista lista = aux2;
// faz lista referenciar o novo nodo // faz lista referenciar o novo nodo
G

C A D E C A D E
Listas Encadeadas Simples Listas Encadeadas Simples
 Vejamos a inclusão Nodo aux2 = new Nodo();  Vejamos a inclusão Nodo aux2 = new Nodo();
de ‘G’ passo a passo: // cria referência aux2 e o novo nodo de ‘G’ passo a passo: // cria referência aux2 e o novo nodo
aux2.data = ‘G’; aux2.data = ‘G’;
// coloca ‘G’ no data do novo nodo // coloca ‘G’ no data do novo nodo
Referência aux2 aux2.link = lista; Referência aux2 aux2.link = lista;
auxiliar // coloca referência da lista no link auxiliar // coloca referência da lista no link
// do novo nodo // do novo nodo
lista lista = aux2; lista lista = aux2;
// faz lista referenciar o novo nodo // faz lista referenciar o novo nodo
G G

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo aux3=lista;
 Note também que basta lista = lista.link;  Para mostrar uma lista // referencia o inicio da lista em aux3
uma instrução em Java como a abaixo while(aux3!=null){
para retirar um elemento poderíamos usar o // enquanto não chegar a nulo
do início da lista: seguinte conjunto de
instruções em Java: System.out.println(aux3.data);
O collect garbage do
// mostra o data
Java se encarrega de
lista Referência aux3=aux3.link
liberar a área de memória
auxiliar // vai para o próximo
do nodo retirado da lista lista aux3 }

C A D E

C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo aux3=lista; Nodo aux3=lista;
// referencia o inicio da lista em aux3
 Executando  aux3 é diferente de // referencia o inicio da lista em aux3
while(aux3!=null){ while(aux3!=null){
passo a passo... // enquanto não chegar a nulo
nulo então entrará // enquanto não chegar a nulo
System.out.println(aux3.data); no loop... System.out.println(aux3.data);
// mostra o data // mostra o data
Referência aux3=aux3.link Referência aux3=aux3.link
auxiliar // vai para o próximo auxiliar // vai para o próximo
lista aux3 } lista aux3 }

C A D E C A D E
Listas Encadeadas Simples Listas Encadeadas Simples
Nodo aux3=lista; Nodo aux3=lista;
 Mostra o valor da // referencia o inicio da lista em aux3  Mostra o valor da // referencia o inicio da lista em aux3
parte data da área while(aux3!=null){ parte data da área while(aux3!=null){
// enquanto não chegar a nulo // enquanto não chegar a nulo
que aux3 que aux3
System.out.println(aux3.data); System.out.println(aux3.data);
referencia: ‘C’ referencia...
// mostra o data // mostra o data
Referência aux3=aux3.link Referência aux3=aux3.link
auxiliar // vai para o próximo auxiliar // vai para o próximo
lista aux3 } lista aux3 }

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo aux3=lista; Nodo aux3=lista;
 Como aux3 não é // referencia o inicio da lista em aux3  Vai para o próximo // referencia o inicio da lista em aux3
nulo continua no while(aux3!=null){ referenciando a while(aux3!=null){
// enquanto não chegar a nulo // enquanto não chegar a nulo
loop e agora área onde está o
System.out.println(aux3.data); System.out.println(aux3.data);
mostra ‘A’ // mostra o data
valor ‘D’... // mostra o data
Referência aux3=aux3.link Referência aux3=aux3.link
auxiliar // vai para o próximo auxiliar // vai para o próximo
lista aux3 } lista aux3 }

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


Nodo aux3=lista; Nodo aux3=lista;
 Como o link3 não é // referencia o inicio da lista em aux3  Vai para o próximo // referencia o inicio da lista em aux3
nulo continua o while(aux3!=null){ referenciando a while(aux3!=null){
// enquanto não chegar a nulo // enquanto não chegar a nulo
loop mostrando o área onde está o
System.out.println(aux3.data); System.out.println(aux3.data);
valor ‘D’... // mostra o data
valor ‘E’... // mostra o data
Referência aux3=aux3.link Referência aux3=aux3.link
auxiliar // vai para o próximo auxiliar // vai para o próximo
lista aux3 } lista aux3 }

C A D E C A D E
Listas Encadeadas Simples Listas Encadeadas Simples
Nodo aux3=lista; Nodo aux3=lista;
 Como o aux3 não // referencia o inicio da lista em aux3  Como a parte link do // referencia o inicio da lista em aux3
nodo referenciado por
é nulo o loop não é while(aux3!=null){ aux3 é nulo aux3
while(aux3!=null){
// enquanto não chegar a nulo // enquanto não chegar a nulo
encerrado e o valor recebe nulo e então
System.out.println(aux3.data); sai do loop. System.out.println(aux3.data);
‘E’ é mostrado...
// mostra o data // mostra o data
Referência aux3=aux3.link Referência aux3=aux3.link
auxiliar // vai para o próximo auxiliar // vai para o próximo
lista aux3 } lista aux3 }

C A D E C A D E

Listas Encadeadas Simples Listas Encadeadas Simples


 Agora estaremos construindo a classe ListaFone com  Em primeiro lugar veremos o método que inclui um
a seguinte estrutura: elemento. O método recebe o nome e o telefone e
class ListaFone { inclui um elemento no início da lista:
class Node {
String nome;
String fone; void IncListaFone (String nm, String fn){
Node link; Node aux = new Node();
} aux.nome = nm;
Node l; aux.fone = fn;
// O construtor coloca nulo em l referência inicial da lista. aux.link = l;
ListaFone () { l = null; } l=aux;
// aqui serão incluídos os métodos de inclusão, busca,
// exclusão e listagem apresentados nos próximos slides... }
}

Listas Encadeadas Simples Listas Encadeadas Simples


 Agora o método que retira um elemento na lista a partir do
 Agora veremos o método que busca um elemento na lista a nome informado. Em princípio vê se a lista é vazia. Senão
partir do nome. Ele usa uma variável auxiliar para percorrer a verifica se é o primeiro elemento pois a retirada é diferente.
lista. A busca continua até chegar ao final da lista ou Senão procura o elemento a partir de uma referência anterior
encontrar o nome. Se encontrar o nome retorna o telefone. e retira se encontrar:
Senão retorna “*”
void RetListaFone (String nm) {
if(l != null) {
String BuscaFone (String nm){ if(l.nome.equals(nm))
Node laux = l; l=l.link;
while(laux != null && !laux.nome.equals(nm)) else {
laux = laux.link; Node laux = l;
if(laux != null) while(laux.link != null && !laux.link.nome.equals(nm))
laux = laux.link;
return laux.fone; if(laux.link != null)
else laux.link = laux.link.link;
return "*"; }
} }
}
Listas Encadeadas Simples Técnicas de Encadeamento
 E agora o método que lista os elementos:  Conheceremos agora algumas técnicas
de encadeamento:
void listar() {  Lista circular;
Node laux = l;  Lista duplamente encaminhada;
System.out.println("\nLista:");
while(laux!=null) {  Lista com nodos sentinelas;
System.out.println(laux.nome + " " + laux.fone);
laux = laux.link;
}
}

Listas Encadeadas Circulares Listas Duplamente Encadeadas


 Uma lista encadeada circular é idêntica a uma  Listas duplamente encadeadas são listas
lista encadeada simples a não ser pela referência lineares em que cada elemento possui
final da lista que não referencia nulo e sim o além da área de dados dois links:
primeiro da lista conforme o exemplo abaixo:
 Um que referencia o antecessor;
 Um que referencia o próximo;
Referência inicial

C A D E

Lista encadeada circular


link data link

Listas Duplamente Encadeadas Nodos sentinelas


 Os nodos sentinelas são nodos que ficam no início e final
 Note que na lista duplamente encadeada: da lista para que todas as operações sejam realizadas
o último elemento tem o link a direita nulo; entre os elementos da lista evitando manipulações nas
extremidades.
o primeiro elemento tem o link à esquerda nulo;  No início coloca-se um valor menor que todos (Low-value ou LV)
 No final um valor maior que todos (high-value ou HV):
Referência inicial
lista

C A D E

LV A D HV
Lista duplamente encadeada
Exercícios com listas Exercícios com listas
1. Para implementarmos uma pilha usando listas 2. Construa um método que retire a duplicidade
encadeadas é necessário guardarmos somente a de elementos de uma lista ordenada cuja
referência inicial da lista como o topo da pilha. referência é passada como parâmetro.
Sendo assim para incluir um elemento na pilha 3. Construa um método que transforme uma lista
basta criar um novo nodo incluí-lo na 1a. posição ligada convencional cuja referência é passada
da lista. Para retirar um elemento da pilha basta como parâmetro em uma lista circular.
retirar o 1o. elemento da lista mantendo o próximo 4. Construa um método que concatene duas listas
elemento como topo. Implemente os métodos ligadas convencionais cujas referências são
push e pop considerando que a classe nodo com passadas como parâmetro.
um campo data do tipo int e um link já foi criada.
- void push(Nodo topo, int elem) 5. Construa um método que conte e retorne a
quantidade de elementos de uma lista ligada cuja
- int pop(Nodo topo) referência é passada como parâmetro.

Exercícios com listas Exercícios com listas


 6. Altere o método do exercício 5 de forma que  10. Construa um método que crie uma nova lista
este agora conte e retorne a quantidade de retornando sua referência a partir da intercalação
elementos de uma lista circular.
de duas listas ordenadas cujas referências são
 7. Construa um método recursivo que mostre os
elementos de uma lista ligada convencional. passadas como parâmetro.
 8. Construa um método que mostre os elementos  11. Considere uma coleção de elementos
de uma lista ligada convencional do último para o dispostos em ordem num vetor e outra coleção de
primeiro. elementos armazenados em uma lista dinâmica
 9. Construa um método que mostre os elementos ordenada. Seria viável implementarmos um
de duas listas ordenadas cujas referências são
passadas como parâmetro, intercalados de algoritmo de busca binária para as duas
acordo com a ordem. coleções? Justifique sua resposta.

Exercícios com listas


12. Considerando que os métodos next, destroy e isempty
já foram desenvolvidos codifique os métodos isfull para
verificar se a fila circular está cheia e o método store para
inserir um elemento na fila.
13. Considerando que os métodos destroy e isempty já
foram desenvolvidos codifique o método store para incluir
um elemento numa fila implementada com listas
encadeadas onde a referência ao primeiro elemento é o
front e a referência do último elemento da lista é o rear.
14. Compare as implementações desenvolvidas nas
questões 12 e 13 quanto a espaço de memória e
velocidade dos algoritmos.

Вам также может понравиться