A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Listas Encadeadas Circulares Listas Duplamente Encadeadas.

Apresentações semelhantes


Apresentação em tema: "Listas Encadeadas Circulares Listas Duplamente Encadeadas."— Transcrição da apresentação:

1 Listas Encadeadas Circulares Listas Duplamente Encadeadas

2 2 Motivação para listas duplamente encadeadas e circulares

3 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ó p Este 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

4 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ão O ponteiro head torna-se permanentemente aterrado e o ponteiro tail aponta o último elemento da lista Outra alternativa consiste em usar apenas um ponteiro externo head

5 5 Listas circulares Ponteiros aterrados representam listas circulares vazias

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

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

8 8 Listas circulares – inclusão no final // frente será o sucessor de tail // depois tail será tail.next public 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 }

9 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

10 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; }

11 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

12 12 LISTAS DUPLAMENTE ENCADEADAS

13 13 LISTAS DUPLAMENTE ENCADEADAS Uma propriedade característica das listas duplamente encadeadas é expressa por: p.next.prev = p = p.prev.next EXEMPLO

14 14 LISTAS DUPLAMENTE ENCADEADAS Memória

15 15 LISTAS DUPLAMENTE ENCADEADAS – Inclusão (1) inclusão do nó apontado por q à direita do nó apontado por p

16 16 LISTAS DUPLAMENTE ENCADEADAS – Exclusão (1) exclusão do nó apontado por q

17 Listas Duplamente Encadeadas Implementação

18 18 Classe DoubleLinkedList public class DoubleLinkedList { protected Element head; // cabeça protected Element tail; // cauda public final class Element { // elemento do lista Object datum; // dado do elemento ou item Element next; // ponteiro para sucessor Element 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; } //... } //... }

19 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; } //... }

20 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; } //... }

21 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; } //... }

22 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; } //... }

23 23 Método append public 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; } //... }

24 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); } //... }

25 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

26 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; }

27 27 Método insertAfter // Inclui item depois do objeto corrente public 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; }

28 28 Método insertBefore // Inclui item antes do objeto corrente public 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; } //... } //... }


Carregar ppt "Listas Encadeadas Circulares Listas Duplamente Encadeadas."

Apresentações semelhantes


Anúncios Google