• 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

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

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

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.);

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