Top Banner
Listas Encadeadas Circulares Listas Duplamente Encadeadas
28

Listas Encadeadas Circulares Listas Duplamente Encadeadas

Jan 05, 2016

Download

Documents

Listas Encadeadas Circulares Listas Duplamente Encadeadas. Motivação para listas duplamente encadeadas e circulares. LISTAS CIRCULARES. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

Listas Encadeadas Circulares Listas Duplamente Encadeadas

Page 2: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

2

Motivação para listas duplamente encadeadas e circulares

Page 3: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

3

LISTAS CIRCULARES

Um dos inconvenientes do emprego de listas encadeadas consiste no caso de, dado um ponteiro para um nó p de uma lista encadeada, não se ter acesso aos nós que precedem o nó pEste inconveniente pode ser contornado com o emprego de listas circulares Listas circulares são listas encadeadas nas quais o ponteiro do último nó deixa de ser aterrado para apontar o primeiro nó da lista

Page 4: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

4

LISTAS CIRCULARES

Uma lista circular não tem um primeiro nó nem último nó “naturais” Uma convenção útil é apontar o ponteiro externo (“tail” para a lista circular) para o último nó, sendo o conceito de último vindo de tempo de inclusãoO ponteiro head torna-se permanentemente aterrado e o ponteiro tail aponta o último elemento da listaOutra alternativa consiste em usar apenas um ponteiro externo head

Page 5: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

5

Listas circulares

Ponteiros aterrados representam listas circulares vazias

Page 6: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

6

Listas circulares – inclusãoInclusão de um nó com endereço apontado por tmp na frente e na retaguarda de uma lista circular apontada por tailA inclusão na retaguarda é uma inclusão na frente seguida de

tail ← tmp

Page 7: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

7

Listas circulares – inclusão na frente

// frente será o sucessor de tail

public void insertFront(Object item){Element tmp = new Element (item, null); if (tail = null) tail = tmp;

else { tmp.next = tail.next; tail.next = tmp; }

}

Page 8: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

8

Listas circulares – inclusão no final

// frente será o sucessor de tail// depois tail será tail.nextpublic void insertRear(Object item){ Element tmp = new Element (item, null); if (tail = null) tail = tmp;

else { tmp.next = tail.next; tail.next = tmp; }

tail = tmp; // transformar primeiro em último

}

Page 9: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

9

Listas circulares – exclusão (1)

Exclusão do nó da frente de uma lista circular na qual tail aponta o último nó com a recuperação da informação desse nó em y

Page 10: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

10

Listas circulares – exclusão (2)

public void extractLast(Object item){ if (tail = null) throw new IllegalArgumentException ("item not found"); Element tmp = tail.next; item = tmp.datum; tail.next = tmp.next if (tail = tmp) tail = null;}

Page 11: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

11

LISTAS DUPLAMENTE ENCADEADAS

Alterando-se os nós de listas encadeadas de forma que cada nó passe a contar, além do registro de informação e do ponteiro para o sucessor, também um ponteiro para antecessor se obtém listas duplamente encadeadas

Page 12: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

12

LISTAS DUPLAMENTE ENCADEADAS

Page 13: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

13

LISTAS DUPLAMENTE ENCADEADAS

Uma propriedade característica das listas duplamente encadeadas é expressa por:

p.next.prev = p = p.prev.next

EXEMPLO

Page 14: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

14

LISTAS DUPLAMENTE ENCADEADAS

Memória

Page 15: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

15

LISTAS DUPLAMENTE ENCADEADAS – Inclusão (1)

inclusão do nó apontado por q à direita do nó apontado por p

Page 16: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

16

LISTAS DUPLAMENTE ENCADEADAS – Exclusão (1)

exclusão do nó apontado por q

Page 17: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

Listas Duplamente Encadeadas

Implementação

Page 18: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

18

Classe DoubleLinkedListpublic class DoubleLinkedList { protected Element head; // cabeça protected Element tail; // cauda public final class Element { // elemento do lista

Object datum; // dado do elemento ou itemElement next; // ponteiro para sucessorElement prev; // ponteiro para antecessor

Element(Object datum, Element next, Element prev) { // construtor this.datum = datum; this.next = next;

this.prev = prev;}

public Object getDatum() // obter dado { return datum; }public Element getNext() // obter sucessor { return next; }

public Element getPrev() // obter antecessor { return prev; }

// ... } // ...}

Page 19: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

19

Métodos Construtor e purge

public class DoubleLinkedList{ protected Element head; protected Element tail; public DoubleLinkedList () // construir uma lista

{}

public void purge () // esvaziar uma lista {

head = null;tail = null;

} // ...}

Page 20: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

20

Métodos getHead, getTail e isEmpty

public class DoubleLinkedList{ protected Element head; protected Element tail; public Element getHead () // cabeça da lista

{ return head; } public Element getTail () // cauda da lista

{ return tail; } public boolean isEmpty () //teste de lista vazia

{ return head == null; }

// ...}

Page 21: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

21

Métods getFirst e getLast

public class DoubleLinkedList { protected Element head; protected Element tail; public Object getFirst() { // obter o primeiro elemento

//da lista if(head == null)

throw new ContainerEmptyException();return head.datum;

}

public Object getLast() {// obter o último elemento //da lista

if(tail == null) throw new ContainerEmptyException();

return tail.datum; } // ...}

Page 22: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

22

Método prepend

public class DoubleLinkedList{ protected Element head; protected Element tail;

// inluir o objeto item no início da lista corrente public void prepend(Object item) {

Element tmp = new Element(item, head, null);

if(head == null) tail = tmp;

head.prev = tmp; head = tmp;

}

// ...}

Page 23: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

23

Método appendpublic class DoubleLinkedList{ protected Element head; protected Element tail;

// incluir o objeto item no final da lista corrente public void append (Object item) {

Element tmp = new Element (item, null, tail); if(head == null) head = tmp; else

tail.next = tmp; tail = tmp;

}

// ...}

Page 24: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

24

Método assign

public class DoubleLinkedList { protected Element head; protected Element tail;// a lista list será uma cópia da lista corrente public void assign(DoubleLinkedList list) {

if(list != this){

purge (); for(Element ptr = list.head;

ptr != null; ptr = ptr.next) {

append (ptr.datum); }

} } // ...}

Page 25: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

25

Método extract (1)public class DoubleLinkedList{ protected Element head; protected Element tail;

// Exclui objeto item public void extract(Object item)

{Element ptr = head;while(ptr != null && ptr.datum != item){

ptr = ptr.next;}

// encontrado ptr // se for válido excluir elemento

Page 26: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

26

Método extract (2)if(ptr == null)

throw new IllegalArgumentException("item not found");if(ptr == head) // exclui head

{ ptr.next.prev = null;

head = ptr.next; }

else {

ptr.prev.next = ptr.next; ptr.next.prev = ptr.prev; }

if(ptr == tail) // exclui tail { ptr.prev.next = null;

tail = ptr.prev; } }}

Page 27: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

27

Método insertAfter

// Inclui item depois do objeto correntepublic void insertAfter(Object item)

{ Element tmp = new Element (item, next, this); if(tail == this){

this.next = tmp; tail = tmp;

} else { next.prev = tmp; this.next = tmp; }

}

Page 28: Listas Encadeadas Circulares   Listas Duplamente Encadeadas

28

Método insertBefore

// Inclui item antes do objeto correntepublic void insertBefore(Object item) { Element tmp = new Element(item, this, this.prev);

if(this == head) { this.prev = tmp;

head = tmp; }

else { prev.next = tmp; this.prev = tmp;

}}// ...

} // ...}