Sei sulla pagina 1di 21

Estruturas de Dados – Aula 04

Prof. Dr. Eduardo Takeo Ueda


eduardo.ueda@fatec.sp.gov.br

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
1
Lista linear duplamente encadeada/ligada

• Na lista duplamente encadeada/ligada, cada nó possui uma


referência para o nó predecessor e outra para o nó sucessor;

• É possível percorrer a lista em dois sentidos: esquerda para


direita e direita para esquerda;

• Em situações em que não existe a necessidade de percorrer a


lista da direita para esquerda é preferível utilizar a lista
simplesmente encadeada/ligada, por ser mais simples de
implementar.

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
2
Lista linear duplamente encadeada/ligada

previous next

lista

Alocação dinâmica

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
3
Classe DNode
public class DNode {
private String element; //Elemento do DNode é uma string
private DNode previous; //Referência para um objeto DNode
private DNode next; //Referência para um objeto DNode
//Cria um node com um elemento e duas referências
public DNode(String s, DNode p, DNode n) {
element = s;
previous = p;
next = n;
}
//Cria um node com um elemento e duas referências null
public DNode(String element) {
this(element, null, null);
}

//métodos getters e setters...

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
4
Classe DNode
//Retorna o elemento deste node
public String getElement() {
return element;
}
//Retorna a referência para o node anterior
public DNode getPrevious() {
return previous;
}
//Retorna a referência para o próximo node
public DNode getNext() {
return next;
}
//Define o elemento deste node
public void setElement(String newElem) {
element = newElem;
}
//Define a referência para o node anterior
public void setPrevious(DNode newPrevious) {
previous = newPrevious;
}
//Define a referência para o próximo node
public void setNext(DNode newNext) {
next = newNext;
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
5
Lista duplamente encadeada/ligada

• Podemos tornar a estrutura mais eficiente:


o utilizar uma segunda variável, chamada tail, que referencia o último
elemento da lista;
o eficiência obtida a custa do espaço adicional.

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
6
Operações sobre listas encadeadas

 public boolean isEmpty()


• verifica se a lista está vazia

 public DNode getFirst()


• retorna o primeiro elemento da lista, sem removê-lo

 public DNode getLast()


• retorna o último elemento da lista, sem removê-lo

 public void insertFirst(DNode novoNode)


• insere element na frente da lista

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
7
Operações sobre listas encadeadas

 public void insertLast(DNode novoNode)


• insere element no final da lista

 public DNode removeFirst()


• remove e retorna o primeiro elemento da lista

 public DNode removeLast()


• remove e retorna o último elemento da lista

 public void show()


• exibe o conteúdo da lista

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
8
Antes de começarmos…
Supondo a existência da classe JDLinkedList, desenhe a lista criada
através do código abaixo (a saída do programa):
public static void main(String args[]) {
JDLinkedList lista = new JDLinkedList();
try {
lista.insertFirst(new DNode("D"));
lista.insertFirst(new DNode("A"));
lista.insertFirst(new DNode("B"));
lista.insertLast(new DNode("S"));
lista.insertLast(new DNode("C"));
lista.removeFirst(); //pode lançar UnderflowException
lista.removeLast(); //pode lançar UnderflowException
} catch (UnderflowException e) {
System.out.println("ERRO: Impossível remover!");
e.printStackTrace();
}
lista.show();
}
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
9
Lista duplamente encadeada/ligada

/** Lista duplamente encadeada/ligada **/


public class JDLinkedList {
protected DNode head; //node cabeça da lista
protected DNode tail; //node cauda da lista
protected long size; //número de nodes da lista
// Construtor default que cria uma lista vazia
public JDLinkedList(){
head = null;
tail = null;
size = 0;
}

//demais métodos...
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
10
Classe UnderflowException

public class UnderflowException extends Exception {


public String toString() {
return "UNDERFLOW!";
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
11
isEmpty(), getFirst() e getLast()
public boolean isEmpty() {
return head == null;
}

public DNode getFirst() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
return head;
}

public DNode getLast() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
return tail;
}
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
12
Inserção no início da lista

public void insertFirst(DNode novoNode) {


if (isEmpty()) {
head = novoNode;
tail = novoNode;
size++;
} else {
novoNode.setNext(head);
head.setPrevious(novoNode);
head = novoNode;
size++;
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
13
Inserção no final da lista

public void insertLast(DNode novoNode) {


if (isEmpty()) {
insertFirst(novoNode);
} else {
tail.setNext(novoNode);
novoNode.setPrevious(tail);
tail = novoNode;
size++;
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
14
Remoção no início da lista

public DNode removeFirst() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
DNode removedItem = head;
if (head == tail) {
head = tail = null;
} else {
head.getNext().setPrevious(null);
head = head.getNext();
}
size--;
return removedItem;
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
15
Remoção no final da lista

public DNode removeLast() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
DNode removedItem = tail;
if (head == tail) {
head = tail = null;
} else {
tail.getPrevious().setNext(null);
tail = tail.getPrevious();
}
size--;
return removedItem;
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
16
Mostrar/exibir elementos da lista

public void show() {


if (isEmpty()) {
System.out.println("Lista vazia!");
} else {
System.out.print("A lista é: ");
DNode current = head;
while (current != null) {
System.out.print(current.getElement().toString() + " ");
current = current.getNext();
}
System.out.println("\n");
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
17
Inserção depois de uma posição qualquer da lista

public void insertAfter(DNode n, int pos) throws IndexOutOfBoundsException {


if (pos < 0 || pos >= size) { //A lista inicia na posição 0
throw new IndexOutOfBoundsException();
}
if (pos == size - 1) {
insertLast(n);
} else {
long posAtual;
DNode current;
if (pos < (size / 2)) {
posAtual = 0;
current = head;
} else {
posAtual = size - 1;
current = tail;
}
//...

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
18
Inserção depois de uma posição qualquer da lista

//...
if (current == head) {
while (posAtual < pos) {
current = current.getNext();
posAtual++;
}
} else {
while (posAtual > pos) {
current = current.getPrevious();
posAtual--;
}
}
n.setNext(current.getNext());
n.setPrevious(current);
current.getNext().setPrevious(n);
current.setNext(n);
size++;
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
19
Atividade
 Implemente um método em Java para remover um node, depois de
uma posição especificada, em uma lista duplamente
encadeada/ligada.
/** Lista duplamente encadeada/ligada **/
public class JDLinkedList {
protected DNode head; //node cabeça da lista
protected DNode tail; //node cauda da lista
protected long size; //número de nodes da lista
// Construtor default que cria uma lista vazia
public JDLinkedList(){
head = null;
tail = null;
size = 0;
}
//métodos...
public DNode removeAfter(int pos) throws IndexOutOfBoundsException {
...
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
20
Fim!

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
21

Potrebbero piacerti anche