• Nenhum resultado encontrado

Lista Encadeada (abordagem recursiva)

N/A
N/A
Protected

Academic year: 2021

Share "Lista Encadeada (abordagem recursiva)"

Copied!
18
0
0

Texto

(1)

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

L

ISTA

L

IGADA

(A

BORDAGEM

R

ECURSIVA

)

Adalberto Cajueiro

Departamento de Sistemas e Computação Universidade Federal de Campina Grande

1

Q

UESTÕES

DE

I

MPLEMENTAÇÃO

Implementacao dinâmica – através de duas

abordagens:

 Estrutura recursiva com métodos iterativos

Cada elemento (nó) da lista contém um dado armazenado e

um apontador para o próximo elemento da lista

 Estrutura recursiva com métodos recursivos

Cada elemento (nó) da lista contém um dado armazenado e

um apontador para o próximo elemento da lista

Não existe mais a idéia de modificar o head. Precisa-se

apenas da referencia para o primeiro nó da lista. Toda a manipulação (e percurso) é resolvida de forma recursiva.

Todo método é invocado no primeiro nó da lista. Se precisar

ir para os outros nós isso é feito de forma recursiva.

(2)

Q

UESTÕES

DE

I

MPLEMENTAÇÃO

Lista vazia

 Representada por um nó especial (NIL) sem dado  Pode tembém ser representado por NULL

Nós sentinela

 Representam a lista vazia e são acrescentados nas

extremidades das listas

 Simplificam e aceleram alguns algoritmos sobre lista

e dão garantia de que uma lista sempre contém algum nó (mesmo que sjea vazio)

null null

Nó sentilena

NIL

3

I

MPLEMENTAÇÃO

Exemplo: lista de inteiros não-negativos

null

-1 5 2

Lista vazia=NIL

(caso base) Lista não vazia (caso indutivo)

Como implementar em Java?

null -1

4

O fato da lista ser implementada de forma

(3)

L

ISTA

(I

MPLEMENTACAO

)

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

L

ISTA

(I

MPLEMENTACAO

)

Na abordagem anterior qual era a estrutura

recursiva?

Qual a relação que existe entre um nó da lista e a

lista encadeada agora?

Uma lista agora precisa encapsular um nó?

 Precisa de head?

(4)

L

ISTA

(I

MPLEMENTACAO

)

public class RecursiveSingleLinkedListImpl<T> implements LinkedList<T>{

protected T data;

protected RecursiveSingleLinkedListImpl<T> next; }

next data

O que o construtor default origina?

7

L

ISTA

(I

MPLEMENTACAO

)

As implementações completamente recursivas

estabelecem duas formas de resolver o problema:

 Caso base: lista vazia

 Caso indutivo: lista não vazia

TODOS os métodos devem seguir esse template!

public class RecursiveSingleLinkedListImpl<T> implements LinkedList<T>{

protected T data;

protected RecursiveSingleLinkedListImpl<T> next; }

(5)

L

ISTA

(

IS

E

MPTY

)

Como seria o isEmpty?

null null 6 null null

isEmpty(){

if data == null //caso base

return true else //caso indutivo

return false }

9

L

ISTA

(I

NSERIR

)

Admitindo que a lista não é ordenada, as

insercoes acontecem sempre ao final da lista

inserir(6) 6 inserir(3) 6 3 NIL NIL NIL 6 NIL inserir(3) 10

(6)

L

ISTA

(I

NSERIR

)

Como seria a inserção 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

L

ISTA

(S

EARCH

)

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

(7)

L

ISTA

(S

EARCH

)

Como seria a procura em uma lista?

list-search(item){

if(isEmpty) //caso base

else //caso indutivo

}

13

L

ISTA

(S

EARCH

)

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

(8)

L

ISTA

(R

EMOVER

)

As remocoes se dão pelo valor armazenado

remover 8 6 8 5

6

8

5

Como seria o algoritmo de remoção na lista?

6 8 5 remover 8 NIL NIL NIL 15

L

ISTA

(R

EMOVER

)

Como seria a remoção em uma lista?

list-remove(item){ if(isEmpty) //caso base

//nao faz nada porque nao contem o elemento else //caso indutivo

}

(9)

L

ISTA

(R

EMOVER

)

Como seria a remoção 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

L

ISTA

(T

AMANHO

)

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 NIL NIL NIL NIL NIL 18

(10)

L

ISTA

(T

AMANHO

)

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

L

ISTA

(T

AMANHO

)

Como seria calcular o tamanho de uma lista?

list-size(){

if(isEmpty) //caso base

else //caso indutivo

}

(11)

L

ISTA

(T

AMANHO

)

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

L

ISTA

(

TO

A

RRAY

)

Como seria para transformar a lista em um

array?

T[] list-toArray(){ T[] result = new T[] return result } 22

(12)

L

ISTA

(

TO

A

RRAY

)

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

E

XERCÍCIO

Implemente um método que inverta uma lista

ligada (abordagem recursiva).

Implemente um método que encontre o maior

elemento de uma lista ligada (abordagem

recursiva).

(13)

L

ISTA

D

UPLAMENTE

L

IGADA

Abordagem Recursiva

25

L

ISTA

D

UPLAMENTE

L

IGADA

Estrutura semelhante a abordagem com métodos

iterativos

Interface de serviços é a mesma

Existência de nós sentinela (início e fim da lista)

Inexistência de head e last

 Precisa-se apenas do primeiro nó da lista

 O início de uma lista não-vazia NÃO é o sentinela

null null null NIL ... null ... null 6 NIL NIL 26

(14)

L

ISTA

D

UPLAMENTE

L

IGADA

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

L

ISTA

D

UPLAMENTE

L

IGADA

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 métodos já existem

em algum lugar?

(15)

L

ISTA

D

UPLAMENTE

L

IGADA

(I

MPLEMENTACAO

)

public class RecursiveDoubleLinkedListImpl<T> extends RecursiveSingleLinkedListImpl<T> implements DoubleLinkedList<T>{

protected RecursiveDoubleLinkedListImpl<T> previous; }

O que o construtor default origina?

Algum método herdado precisa ser sobrescrito?

29

L

ISTA

D

UPLAMENTE

L

IGADA

(I

MPLEMENTACAO

)

public class RecursiveDoubleLinkedListImpl<T> extends RecursiveSingleLinkedListImpl<T> implements DoubleLinkedList<T>{

protected RecursiveDoubleLinkedListImpl<T> previous; }

O que o construtor default origina?

Algum método herdado precisa ser sobrescrito?

insert,remove

(16)

L

ISTA

D

UPLA

(

INSERIR

NO

FINAL

=

DEFAULT

)

inserir(6) NIL NIL 6 NIL

inserir(10) NIL 6 10 NIL

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) }

L

ISTA

D

UPLA

(I

MPLEMENTACAO

-

I

NSERÇÃO

)

(17)

L

ISTA

D

UPLA

(R

EMOVER

PELA

C

HAVE

=

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) } }

L

ISTA

D

UPLA

(I

MPLEMENTACAO

R

EMOÇÃO

PELA

CHAVE

)

(18)

E

XERCÍCIO

Implementar os seguinte métodos na lista

duplamente encadeada recursiva.

public void insertFirst(T element);

public void removeFirst(); public void removeLast();

35

R

EFERÊNCIAS

Capítulo 11

Referências

Documentos relacionados

O diabetes mellitus tipo 1A (DM1A), doença autoimune órgão-específica, resulta da destruição seletiva das células β pancreáticas produtoras de insulina

78 Figura 3.27 Padrão de difração de pós obtido para o complexo ácido nalidíxico:Zn através (a) de síntese por solução, em comparação com os difractogramas

O ICP é o desvio-padrão entre os preços praticados pelos postos em cada cidade dividido pelo preço médio que os postos cobram ao consumidor pela gasolina comum;. A concorrência

Os PO do QREN financiarão as participações das entidades promotoras no capital do FINOVA, ou no capital de outros instrumentos de financiamento enunciados no artigo 5º, de acordo

O LAVI vem sendo montado gradativamente, com recursos provenientes do FDA (Fundo de Desenvolvimento Acadêmico) e LABGRAD (Programa de Apoio aos Laboratórios de

Fica garantido pelos EMPREGADORES o fornecimento de VALE ALIMENTAÇÃO OU VALE REFEIÇÃO a todos os EMPREGADOS em atividade das categorias albergadas por esta CONVENÇÃO COLETIVA

Para reduzir o consumo de energia eléctrica, água ou gás, não use o aparelho em vazio ou em condições que comprometam o rendimento máximo (por ex. portas ou tampas abertas, etc.);

Pós-graduação na área de Tecnologia da Informação na função escolhida (carga horária mínima de 360 horas), acrescido de experiência profissional superior a cinco anos