listas encadeadas circulares listas duplamente encadeadas
Post on 05-Jan-2016
151 Views
Preview:
DESCRIPTION
TRANSCRIPT
Listas Encadeadas Circulares Listas Duplamente Encadeadas
2
Motivação para listas duplamente encadeadas e circulares
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
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
5
Listas circulares
Ponteiros aterrados representam listas circulares vazias
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
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
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
}
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
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
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
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
14
LISTAS DUPLAMENTE ENCADEADAS
Memória
15
LISTAS DUPLAMENTE ENCADEADAS – Inclusão (1)
inclusão do nó apontado por q à direita do nó apontado por p
16
LISTAS DUPLAMENTE ENCADEADAS – Exclusão (1)
exclusão do nó apontado por q
Listas Duplamente Encadeadas
Implementação
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; }
// ... } // ...}
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
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
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
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
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;
}
// ...}
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
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
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
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; }
}
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;
}}// ...
} // ...}
top related