E STRUTURAS DED ADOSE A LGORITMOS L

23 

Full text

(1)

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

L

ISTA

L

IGADA Adalberto Cajueiro

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

1

L

ISTA

L

IGADA

(L

INKED

L

IST

)

É uma estrutura de dados em que objetos

sao arranjados em ordem linear.

Ordem estabelecida por ligacao (links)

entre elementos da lista.

Cada nó da lista armazena um elemento e

uma referencia para o próximo nó da lista.

5

6

8

(2)

L

ISTA

L

IGADA

(L

INKED

L

IST

)

Características

Um dos

tipos abstratos de dados fundamentais

Seqüência de

tamanho arbitrário

e dinâmico

de elementos de algum tipo base

Utiliza o

espaço necessário (alocação dinâmica)

A ordem é determinada por um

ponteiro

e não

pelo

índice

como no array

Acesso sequencial

3

L

ISTA

Operações

Inserir

Remover

Pesquisar

Tamanho

Vazio

(3)

Q

UESTÕES

DE

I

MPLEMENTAÇÃO

Implementacao estática

implementada

com arrays

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

next

data

5

Q

UESTÕES

DE

I

MPLEMENTAÇÃO

Lista vazia

 Representada por um nó especial (NIL) sem dado

 Pode também ser representado por NULL (não recomendado)

Nós sentinela

 Representam a lista vazia e são acrescentados nas extremidades das listas

(4)

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

head head

7

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

)

public class SingleLinkedListNode<T> { protected T data;

protected SingleLinkedListNode<T> next;

public SingleLinkedListNode () { }

public SingleLinkedListNode (T data, Node<T> next) {

this.data = data; this.next = next; }

public boolean isNIL(){ return (this.data == null); }

}

next

data

NIL

next

data

9

L

ISTA

(I

MPLEMENTACAO

)

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

protected SingleLinkedListListNode<T> head;

public SingleLinkedListImpl() {

head = new SingleLinkedListNode<T>(); }

... }

head

(6)

L

ISTA

(

IS

E

MPTY

)

Apenas a lista vazia deve retornar true.

isEmpty(){ if head == NIL return true else

return false }

11

L

ISTA

(I

NSERIR

)

Listas não ordenadas

 Insercoes no início ou no fim 

Listas ordenadas

 Insercoes na posição correta (preservar ordem)

inserir(6)

6

NIL

head

6

6

NIL

NIL

NIL

head

inicio

fim

ordenado

(7)

L

ISTA

(I

NSERIR

)

Listas não ordenadas

 Insercoes no início ou no fim 

Listas ordenadas

 Insercoes na posição correta (preservar ordem)

inserir(3) 6 head head 3 6 NIL NIL NIL inicio fim ordenado

6 NIL

3

6

3

13

L

ISTA

(I

NSERIR

)

Listas não ordenadas

 Insercoes no início ou no fim 

Listas ordenadas

 Insercoes na posição correta (preservar ordem)

inserir(5) head

head inicio

fim

ordenado

6 NIL

3

6 NIL

3 5

5 NIL

6 3

6 NIL

(8)

L

ISTA

(I

NSERIR

)

Adotar listas não ordenadas e inserção ao final

list-insert(item){ auxHead = head if(head = NIL){

newHead = new SingleLinkedListNode(item) newHead.next= head

head = newHead } else{

while(auxHead.next != NIL){ auxHead = auxHead.next }

newNode = new SingleLinkedListNode(item) newNode.next = auxHead.next

auxHead.next = newNode }

}

Qual o tempo de execução?

15

L

ISTA

(P

ROCURAR

)

A procura é sequencial e se dá pelo valor

armazenado

procurar 5

6 8 5

null

6 8 5

6 8 5

NIL

NIL

NIL

NIL

head

(9)

L

ISTA

(P

ROCURAR

)

Qual o tempo de execução?

17

L

ISTA

(R

EMOVER

)

As remocoes se dão pelo valor armazenado

remover 8 6 8 5

6 5

6 8 5

NIL

NIL

NIL

head

8

(10)

L

ISTA

(R

EMOVER

)

As remocoes se dão pelo valor armazenado

list-remove(item){ if head.data == item head = head.next else{

aux = head

while aux != NIL and aux.data != item { previous = aux

aux = aux.next }

if aux != NIL{

previous.next = aux.next }

Qual o tempo de execução?

19

L

ISTA

(T

AMANHO

)

Como calcular o tamanho de uma lista?

tamanho

6 8 5

0

6 8 5

tamanho

6 8 5

NIL

NIL

NIL

NIL 3

(11)

L

ISTA

(T

AMANHO

)

list-size(){ size = 0 aux = head

while aux != NIL { size = size + 1 aux = aux.next }

return size }

21

L

ISTA

(T

AMANHO

)

list-size(){ size = 0 aux = head

while aux != NIL { size = size + 1 aux = aux.next }

return size }

(12)

L

ISTA

(

TO

A

RRAY

)

Deve retornar um array contendo os elementos

da lista na ordem do head para o final.

23

T[] list-toArray(){ T[] result = new T[] aux = head

int count = 0 while aux != NIL {

result[count] = aux.data aux = aux.next

count++ }

return result }

E

XERCÍCIO

Implemente um método que encontre o maior

elemento de uma lista ligada.

Implemente um método que encontre o menor

elemento de uma lista ligada.

(13)

L

ISTA

D

UPLAMENTE

L

IGADA

25

L

ISTA

D

UPLAMENTE

L

IGADA

Cada nó tem referências para os

nós sucessor e

predecessor

Listas duplamente encadeadas têm a vantagem

de poderem ser

percorridas em ambas as direções

Isto permite

reduzir para a metade

o tempo

máximo para

acessar um elemento

com base no

seu índice

-1 null

(14)

L

ISTA

(I

MPLEMENTACAO

)

Como seria a implementação de uma lista

duplamente ligada?

 A estrutura do nó muda?

 A estrutura da lista em si muda?

27 next

data

next

data previous

L

ISTA

(I

MPLEMENTACAO

)

Como seria a implementação de uma lista

duplamente ligada?

28

public class DoubleLinkedListNode<T> extends SingleLinkedListNode<T> {

protected DoubleLinkedListNode<T> previous;

public DoubleLinkedListNode() { }

public DoubleLinkedListNode(T data,

DoubleLinkedListNode<T> next,

DoubleLinkedListNode<T> previous) {

super(data, next); this.previous = previous;

NIL

(15)

L

ISTA

(I

MPLEMENTACAO

)

Como seria a implementação de uma lista

duplamente ligada?

29 public interface DoubleLinkedList<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();

}

L

ISTA

(I

MPLEMENTACAO

)

Como seria a implementação de uma lista

duplamente ligada?

public interface DoubleLinkedList<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();

(16)

L

ISTA

(I

MPLEMENTACAO

)

Como seria a implementação de uma lista

duplamente ligada?

31

public interface DoubleLinkedList<T> extends LinkedList<T> {

public void insertFirst(T element); public void removeFirst();

public void removeLast(); }

public class DoubleLinkedListImpl<T> extends SingleLinkedListImpl<T> implements DoubleLinkedList<T> {

DoubleLinkedListNode<T> last;

public DoubleLinkedListImpl() { head = new DoubleLinkedListNode(); last = head;

} }

L

ISTA

(I

MPLEMENTACAO

)

last

NIL

head

Algum método herdado precisa ser sobrescrito?

(17)

public class DoubleLinkedListImpl<T> extends SingleLinkedListImpl<T> implements DoubleLinkedList<T> {

DoubleLinkedListNode<T> last;

public DoubleLinkedListImpl() { head = new DoubleLinkedListNode(); last = head;

} }

L

ISTA

(I

MPLEMENTACAO

)

last

NIL

head

Algum método herdado precisa ser sobrescrito?

search (por otimização),insert,remove

33

L

ISTA

D

UPLA

(S

EARCH

)

Pelos dois sentidos: head e last

search(6) NIL 6

head

NIL

head last

NIL

search(x) NIL 10 6 NIL

head

last

(18)

//busca (com otimização) List-search(item){

auxHead = head auxLast = last

while(auxHead != auxLast and auxHead.next != auxLast auxHead.data != item and auxLast.data != item){ auxHead = auxHead.next

auxLast = auxLast.previous }

if auxHead.data == item return auxHead.data if auxLast.data == item return auxLast.data }

L

ISTA

D

UPLA

(I

MPLEMENTAÇÃO

)

35

L

ISTA

D

UPLA

(I

NSERIR

NO

FINAL

=

DEFAULT

)

inserir(6) NIL 6

head

NIL

head

NIL

inserir(10) NIL 6 10 NIL

head

last last

last

(19)

L

ISTA

D

UPLA

(I

NSERIR

NO

FINAL

=

DEFAULT

)

//insere no final e ajusta os links next e previous List-insert-last(item){

newLast = new DoubleLinkedListNode(item) newLast.previous = last

newLast.next = NIL last.next = newLast

if last == NIL{ //para o caso da lista vazia head = newLast

}

last = newLast }

37

L

ISTA

D

UPLA

(I

NSERIR

NO

INÍCIO

)

inserir(6) NIL 6

head

NIL

head last

NIL

inserir(10) NIL 10 6 NIL

head

last

(20)

//insere no começo e ajusta os links next e previous List-insert(item){

newHead = new DoubleLinkedListNode(item) newHead.next = head

newHead.previous = NIL head.previous = newHead

if head == NIL{ //para o caso da lista vazia last = newHead

}

head = newHead }

List-insert-first(item){ List-insert(item) }

L

ISTA

D

UPLA

(I

NSERIR

NO

INÍCIO

)

39

L

ISTA

D

UPLA

(R

EMOVER

NO

INICIO

)

remove-first() NIL

head

6 NIL

head

NIL

10 NIL NIL 6

head

remove-first()

head

last last

last

(21)

L

ISTA

D

UPLA

(R

EMOVER

NO

INICIO

)

//remover do inicio List-remove-first(){ if head != NIL { head = head.next if head == NIL{ last = head }

head.previous = NIL }

}

41

L

ISTA

D

UPLA

(R

EMOVER

NO

FINAL

)

remove-last() NIL

head last

6 NIL

head

NIL

last

10 NIL NIL

last

6 head

remove-last()

(22)

L

ISTA

D

UPLA

(R

EMOVER

NO

FINAL

)

//remover do final List-remove-last(){ if last != NIL { last = last.previous if last == NIL{ head = last }

last.next = NIL }

}

43

L

ISTA

D

UPLA

(R

EMOVER

PELA

C

HAVE

=

DEFAULT

)

44

remover(6) NIL

head last

6 NIL

head

NIL

last

10 NIL NIL

last

6 head

remover(6)

(23)

L

ISTA

D

UPLA

(R

EMOVER

PELA

CHAVE

=

DEFAULT

)

list-remove(item){ if head.data == item remove-first() else{

aux = head

while aux != NIL and aux.data != item { aux = aux.next

}

if aux != NIL{

aux.previous.next = aux.next aux.next.previous = aux.previous }

45

R

EFERÊNCIAS

Figure

Updating...

References

Updating...

Download now (23 página)