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

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

Listas Duplamente Encadeadas Profs Prog2 e Lab2 Unisinos.

Apresentações semelhantes


Apresentação em tema: "Listas Duplamente Encadeadas Profs Prog2 e Lab2 Unisinos."— Transcrição da apresentação:

1 Listas Duplamente Encadeadas Profs Prog2 e Lab2 Unisinos

2 Programação II 2 Listas Duplamente Encadeadas Cada nó possui dois ponteiros: Vantagem: simplifica certas operações e permite percorrer a lista nos dois sentidos. Desvantagem: gasta mais espaço do que a simplesmente encadeada (mais um ponteiro em cada nó) e pode tornar mais complexas certas operações. previous element next nónó

3 Programação II 3 Lista encadeada com referência ao ultimo elemento da lista Apontador para o primeiro nó da lista head Apontador para o último nó da lista tail null final de lista null início de lista

4 Programação II 4 classe DNode public class DNode { private E element; private DNode next; private DNode previous; public DNode(E element) { this (element, null, null); } public DNode(E element, DNode next, DNode previous) { super(); this.element = element; this.next = next; this.previous = previous; } public E getElement() { return element; } public void setElement(E element) { this.element = element; } public DNode getNext() { return next; } public void setNext(DNode next) { this.next = next; } public DNode getPrevious() { return previous; } public void setPrevious(DNode previous) { this.previous = previous; } } // end of class previous element next nónó

5 Programação II 5 class DLinkedList (1) public class DLinkedList { protected DNode head; //nodo cabeça da lista protected DNode tail; //nodo cauda da lista protected long size; //número de nodos da lista public DLinkedList() { size = 0; head = tail = null; } public boolean isEmpty() { return head == null; } head tail

6 Programação II 6 class DLinkedList (2) public E getFirst() throws UnderflowException { if (isEmpty()) throw new UnderflowException(); return head.getElement(); } public E getLast() throws UnderflowException { if (isEmpty()) throw new UnderflowException(); return tail.getElement(); } head b tail cde

7 Programação II class DLinkedList (3) public void addFirst(E insertItem) { DNode n = new DNode (insertItem); if (isEmpty()) { head = tail = n; } else { head.setPrevious(n); n.setNext(head); head = n; } size++; } head b tail cdea n

8 Programação II class DLinkedList (3) public void addFirst(E insertItem) { DNode n = new DNode (insertItem); } head b tail cde a n

9 Programação II class DLinkedList (3) public void addFirst(E insertItem) { DNode n = new DNode (insertItem); if (isEmpty()) { head = tail = n; } a n head tail

10 Programação II class DLinkedList (3) public void addFirst(E insertItem) { DNode n = new DNode (insertItem); if (isEmpty()) { head = tail = n; } else { head.setPrevious(n); n.setNext(head); head = n; } size++; } head b tail cdea n

11 Programação II class DLinkedList (4) public void addLast(E insertItem) { DNode n = new DNode (insertItem); if (isEmpty()) { head = tail = n; } else { tail.setNext(n); n.setPrevious(tail); tail = n; } size++; } head b tail cdex n

12 null Programação II 12 class DLinkedList (5) head tail e removedItem e public E removeFirst() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } E removedItem = head.getElement(); if (head == tail) { head = tail = null; } return removedItem; }

13 Programação II 13 class DLinkedList (5) public E removeFirst() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } E removedItem = head.getElement(); if (head == tail) { head = tail = null; } else { head = head.getNext(); head.setPrevious(null); } size--; return removedItem; } head b tail cde

14 Programação II 14 class DLinkedList (6) public E removeLast() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } E removedItem = tail.getElement(); if (head == tail) { head = tail = null; } else { DNode penultimo = tail.getPrevious(); tail = penultimo; tail.setNext(null); } size--; return removedItem; } head b tail cde penultimo

15 Programação II 15 class DLinkedList (7) public void print() { DNode current = head; while (current != null) { System.out.println(current.getElement()); current = current.getNext(); } head 2 tail 345 current =null

16 Programação II 16 Testando a lista public static void main(String args[]) { DLinkedList list = new DLinkedList (); list.addLast(2); list.addLast(4); list.addLast(6); list.addLast(1); list.addLast(8); list.addLast(9); list.print(); try { list.removeFirst(); } catch (UnderflowException e) { e.printStackTrace(); } list.print(); }

17 Exercício 1 Na classe DLinkedList (implementação de lista duplamente encadeada), implementar um método com a seguinte assinatura: –“ private Node find(E key) ”. Este método deve buscar na lista o nó de chave key e retorná-lo. Programação II 17

18 Exercício 1 public DNode find(E key) { DNode current = head; while (current != null) { if (current.getElement().equals(key)) { return current; } current = current.getNext(); } return null; } Programação II 18

19 Exercício 2 Na classe DLinkedList (implementação de lista duplamente encadeada), implementar um método com a seguinte assinatura: –“ public boolean addBefore (E el, E key) ”. Este método deve inserir na lista um nó com chave el na posição anterior ao nó que contenha a chave key. Programação II 19

20 Exercício 2 public boolean addBefore(E el, E chave) { DNode current = find(chave); if (current == null) { return false; } else if (current == head) { addFirst(el); return true; } else { DNode n2 = new DNode (el); DNode before = current.getPrevious(); before.setNext(n2); n2.setPrevious(before); n2.setNext(current); current.setPrevious(n2); return true; } Programação II 20


Carregar ppt "Listas Duplamente Encadeadas Profs Prog2 e Lab2 Unisinos."

Apresentações semelhantes


Anúncios Google