Você está na página 1de 7

Lista Duplamente Encadeada

Isabel Harb Manssour

Porto Alegre, abril de 2019

Introdução

◼ Lista linear
◼ Alocação dinâmica

◼ Operações:
◼ Inserção
◼ Remoção
◼ Consulta
◼ ...

1
Introdução
◼ Lista duplamente encadeada
◼ Nodos conectados por links
◼ Acesso direto ao primeiro elemento é obrigatório
◼ Acesso direto ao último elemento é desejável
◼ Outros nodos podem ser acessados a partir dos links

head tail

◼ Vantagens:
◼ Permite percorrer a lista nas duas direções
◼ Otimiza algoritmos de busca

Nodo
◼ Na lista duplamente encadeada os nodos tem três
atributos
◼ element elemento armazenado no nodo
◼ next próximo nodo no encadeamento da lista (contém
referência para um objeto da mesma classe)
◼ prev nodo anterior no encadeamento da lista (contém
referência para um objeto da mesma classe)

prev next
element

2
Nodo
◼ Implementação de um nodo
◼ Exemplo de código Java para a classe nodo da lista
duplamente encadeada

private class Node {


public Integer element;
public Node next;
public Node prev;
public Node(Integer e) {
element = e;
next = null;
prev = null;
}
}
5

Lista com Encadeamento Duplo

◼ Implementação de listas duplamente encadeadas:


◼ Utiliza atributos para sentinelas de início (header) e fim
(trailer) da lista

header trailer

◼ Sentinelas são nodos SEM itens armazenados


◼ Facilitam as operações de inserção e remoção de itens no início
e fim da lista, de modo que não seja preciso testar casos
especiais

3
Lista com Encadeamento Duplo

◼ Inserção de nodos na lista:


◼ Inserir um nodo q (contendo o item X) após o nodo p:

Lista com Encadeamento Duplo

◼ Remoção de nodos na lista:


◼ Remover um nodo p:

4
Lista com Encadeamento Duplo

◼ Classe para lista duplamente encadeada:

class DoubleLinkedListOfInteger
Node header
Node trailer
int count
DoubleLinkedListOfInteger()
header = new Node(null);
trailer = new Node(null);
header.next = trailer;
trailer.prev = header;
count = 0;

Lista com Encadeamento Duplo


◼ O TAD:
◼ Suporta, por exemplo, os seguintes métodos:
◼ add(e): insere um elemento no final da lista
◼ add(index, e): insere um elemento em determinada posição
(index) da lista
◼ get(index)/set(index, e): get/set o elemento na posição index
◼ remove(e): remove o elemento da lista
◼ isEmpty(): retorna true se a lista está vazia
◼ size(): retorna o número de elementos armazenados na lista
◼ contains(e): retorna true se a lista contém o elemento
◼ indexOf(e): retorna a posição onde o elemento está na lista
◼ clear(): remove todos os elementos da lista

10

5
Lista com Encadeamento Duplo

◼ Classe:
class DoubleLinkedListOfInteger
// Atributos // Métodos
Node header DoubleLinkedListOfInteger()
Node trailer void add (int element)
int count void add (int index , int element)
int get (int index)
int set (int index , int element)
boolean remove (int element)
int removeByIndex (int index )
boolean isEmpty ( )
int size ( )
boolean contains (int element)
int indexOf (int element)
void clear ( )

11

Lista com Encadeamento Duplo

◼ Exercícios:
◼ Implementar os métodos da classe
DoubleLinkedListOfInteger
◼ Acrescentar os seguintes métodos na classe
DoubleLinkedListOfInteger :
◼ int[] subList(int fromIndex, int toIndex), que retorna um arranjo
com os elementos da lista original entre fromIndex (inclusivo)
e toIndex (exclusivo).
◼ void reverse(), que inverte o conteúdo da lista.
◼ int contaOcorrencias(int element), que conta o número de
ocorrências do elemento passado como parâmetro na lista,
retornando este valor.

12

6
Referências

◼ Livro do Goodrich
◼ Seção 3.3

13