You are on page 1of 18

31/01/2013

1
ESTRUTURAS DE DADOS E
ALGORITMOS

LISTA LIGADA (ABORDAGEM
RECURSIVA)
Adalberto Cajueiro
Departamento de Sistemas e Computao
Universidade Federal de Campina Grande
1
QUESTES DE IMPLEMENTAO
Implementacao dinmica atravs de duas
abordagens:
Estrutura recursiva com mtodos iterativos
Cada elemento (n) da lista contm um dado armazenado e
um apontador para o prximo elemento da lista
Estrutura recursiva com mtodos recursivos
Cada elemento (n) da lista contm um dado armazenado e
um apontador para o prximo elemento da lista
No existe mais a idia de modificar o head. Precisa-se
apenas da referencia para o primeiro n da lista. Toda a
manipulao (e percurso) resolvida de forma recursiva.
Todo mtodo invocado no primeiro n da lista. Se precisar
ir para os outros ns isso feito de forma recursiva.



next
data
2
31/01/2013
2
QUESTES DE IMPLEMENTAO
Lista vazia
Representada por um n especial (NIL) sem dado
Pode tembm ser representado por NULL
Ns sentinela
Representam a lista vazia e so acrescentados nas
extremidades das listas
Simplificam e aceleram alguns algoritmos sobre lista
e do garantia de que uma lista sempre contm
algum n (mesmo que sjea vazio)


null
null
N sentilena
NIL
3
IMPLEMENTAO
Exemplo: lista de inteiros no-negativos

null
-1 5 2
Lista vazia=NIL
(caso base)
Lista no vazia
(caso indutivo)
Como implementar em Java?
null
-1
4
O fato da lista ser implementada de forma
toda recursiva muda sua interface ?
31/01/2013
3
LISTA (IMPLEMENTACAO)
public interface LinkedList<T> {
public boolean isEmpty();
public int size();
public T search(T element);
public void insert(T element);
public void remove(T element);
public T[] toArray();
}
5
LISTA (IMPLEMENTACAO)
Na abordagem anterior qual era a estrutura
recursiva?
Qual a relao que existe entre um n da lista e a
lista encadeada agora?
Uma lista agora precisa encapsular um n?
Precisa de head?
6
31/01/2013
4
LISTA (IMPLEMENTACAO)
public class RecursiveSingleLinkedListImpl<T>
implements LinkedList<T>{

protected T data;
protected RecursiveSingleLinkedListImpl<T> next;

}
next
data
O que o construtor default origina?
7
LISTA (IMPLEMENTACAO)
As implementaes completamente recursivas
estabelecem duas formas de resolver o problema:
Caso base: lista vazia
Caso indutivo: lista no vazia
TODOS os mtodos devem seguir esse template!
public class RecursiveSingleLinkedListImpl<T>
implements LinkedList<T>{

protected T data;
protected RecursiveSingleLinkedListImpl<T> next;

}
8
31/01/2013
5
LISTA (ISEMPTY)
Como seria o isEmpty?
null null 6 null null
isEmpty(){
if data == null //caso base
return true
else //caso indutivo
return false
}

9
LISTA (INSERIR)
Admitindo que a lista no ordenada, as
insercoes acontecem sempre ao final da lista
inserir(6)
6
inserir(3)
6 3
NIL
NIL
NIL
6 NIL
inserir(3)
10
31/01/2013
6
LISTA (INSERIR)
Como seria a insero em uma lista
(considerando o template)?
list-insert(item){
if(isEmpty) //caso base
data = item
next = new RecursiveSingleLinkedListImpl<T>( )
else //caso indutivo
next.list-insert(item)
}

11
LISTA (SEARCH)
Procura sequencial pelo valor armazenado
procurar 5
6 8 5
null
6 8 5
procurar 5
procurar 5
5
6 8 5
procurar 5
NIL
NIL
NIL
NIL
12
31/01/2013
7
LISTA (SEARCH)
Como seria a procura em uma lista?
list-search(item){
if(isEmpty) //caso base

else //caso indutivo




}
13
LISTA (SEARCH)
Como seria a procura em uma lista?
list-search(item){
if(isEmpty) //caso base
return null
else //caso indutivo
if data==item
return data
else
return next.list-search(item)
}
14
31/01/2013
8
LISTA (REMOVER)
As remocoes se do pelo valor armazenado
remover 8 6 8 5
6
8
5
Como seria o algoritmo de remoo na lista?
6 8 5
remover 8
NIL
NIL
NIL
15
LISTA (REMOVER)
Como seria a remoo em uma lista?
list-remove(item){
if(isEmpty) //caso base
//nao faz nada porque nao contem o elemento
else //caso indutivo





}
16
31/01/2013
9
LISTA (REMOVER)
Como seria a remoo em uma lista?
list-remove(item){
if(isEmpty) //caso base
//nao faz nada porque nao contem o elemento
else //caso indutivo
if data==item
data = next.data
next = next.next
else
next.list-remove(item)
}
17
LISTA (TAMANHO)
Como calcular o tamanho de uma lista?
tamanho
6 8 5
0
6 8 5 tamanho
1 + tamanho
6 8 5
1 + 1 + tamanho
6 8 5
1 + 1 + 1 + tamanho
NIL
NIL
NIL
NIL
NIL
18
31/01/2013
10
LISTA (TAMANHO)
Como calcular o tamanho de uma lista?
tamanho
6 8 5
0
6 8 5 tamanho
1 + tamanho
6 8 5
1 + 1 + tamanho
6 8 5
1 + 1 + 1 + 0
NIL
NIL
NIL
NIL
NIL
19
LISTA (TAMANHO)
Como seria calcular o tamanho de uma lista?
list-size(){
if(isEmpty) //caso base

else //caso indutivo

}
20
31/01/2013
11
LISTA (TAMANHO)
Como seria calcular o tamanho de uma lista?
list-size(){
if(isEmpty) //caso base
return 0
else //caso indutivo
return 1 + next.list-size()
}
21
LISTA (TOARRAY)
Como seria para transformar a lista em um
array?
T[] list-toArray(){
T[] result = new T[]

return result
}








22
31/01/2013
12
LISTA (TOARRAY)
Como seria para transformar a lista em um
array?
T[] list-toArray(){
T[] result = new T[]
toArray(result,this)
return result
}

toArray (T[] array, RecursiveSingleLinkedListImpl node){
if (!node.isEmpty){
array.add(node.data)
toArrayRecursive(array,node.next)
}
}
23
EXERCCIO
Implemente um mtodo que inverta uma lista
ligada (abordagem recursiva).
Implemente um mtodo que encontre o maior
elemento de uma lista ligada (abordagem
recursiva).
24
31/01/2013
13
LISTA DUPLAMENTE LIGADA
Abordagem Recursiva 25
LISTA DUPLAMENTE LIGADA
Estrutura semelhante a abordagem com mtodos
iterativos
Interface de servios a mesma
Existncia de ns sentinela (incio e fim da lista)
Inexistncia de head e last
Precisa-se apenas do primeiro n da lista
O incio de uma lista no-vazia NO o sentinela
null null
null
NIL
...
null
null
null ...
null
6 NIL
NIL
26
31/01/2013
14
LISTA DUPLAMENTE LIGADA
public interface LinkedList<T> {
public boolean isEmpty();
public int size();
public T search(T element);
public void insert(T element);
public void remove(T element);
public T[] toArray();
public void insertFirst(T element);
public void removeFirst();
public void removeLast();
}
27
LISTA DUPLAMENTE LIGADA
public interface LinkedList<T> {
public boolean isEmpty();
public int size();
public T search(T element);
public void insert(T element);
public void remove(T element);
public T[] toArray();
public void insertFirst(T element);
public void removeFirst();
public void removeLast();
}
28
Esses mtodos j existem
em algum lugar?
31/01/2013
15
LISTA DUPLAMENTE
LIGADA(IMPLEMENTACAO)
public class RecursiveDoubleLinkedListImpl<T>
extends RecursiveSingleLinkedListImpl<T>
implements DoubleLinkedList<T>{

protected RecursiveDoubleLinkedListImpl<T> previous;

}
O que o construtor default origina?
Algum mtodo herdado precisa ser sobrescrito?
29
LISTA DUPLAMENTE
LIGADA(IMPLEMENTACAO)
public class RecursiveDoubleLinkedListImpl<T>
extends RecursiveSingleLinkedListImpl<T>
implements DoubleLinkedList<T>{

protected RecursiveDoubleLinkedListImpl<T> previous;

}
O que o construtor default origina?
Algum mtodo herdado precisa ser sobrescrito?
insert,remove
30
31/01/2013
16
LISTA DUPLA(INSERIR NO
FINAL=DEFAULT)
inserir(6)
6
NIL
NIL
NIL
inserir(10)
10 NIL
NIL
6
31
//insere sempre no final
list-insert(item){
if (isEmpty()){
data = element
next = NIL //previous do NIL precisa ser conectado!!!
if (previous==null){
previous = NIL
}
}else{
next.list-insert(item)
}
LISTA DUPLA(IMPLEMENTACAO -
INSERO)
32
31/01/2013
17
LISTA DUPLA(REMOVER PELA CHAVE =
DEFAULT)
33
remover(6)
NIL
6 NIL
NIL
10 NIL
NIL
6
remover(6)
10 NIL
NIL
NIL remover(6)
NIL
//remove pelo elemento (chave)
remove(item){
if (isEmpty()){
fazer nada
}else{
if (this.data == item){
if(previous.isEmpty && next.isEmpty){
data = next = previous = null
} else{
data = next.data
next = next.next
if(next != null)
next.previous = this
}
} else{
next.remove(item)
}
}
}
LISTA DUPLA(IMPLEMENTACAO
REMOO PELA CHAVE)
34
31/01/2013
18
EXERCCIO
Implementar os seguinte mtodos na lista
duplamente encadeada recursiva.
public void insertFirst(T element);
public void removeFirst();
public void removeLast();

35
REFERNCIAS
Captulo 11




36

You might also like