29
Listas Simplesmente Encadeadas Professores de Programação II

Listas Simplesmente Encadeadas Professores de Programação II

Embed Size (px)

Citation preview

Page 1: Listas Simplesmente Encadeadas Professores de Programação II

Listas Simplesmente Encadeadas

Professores de Programação II

Page 2: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Criando um objeto

• Objeto é uma instância de uma classe;• Usamos o operador new para criar um objeto.

ContaCorrente minhaConta;minhaConta = new ContaCorrente ( );

ContaCorrente minhaConta;minhaConta = new ContaCorrente ( );

Variável que conterá umareferência a um objeto

Criação do objeto

ContaCorrente minhaConta = new ContaCorrente ( );

2

Page 3: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Garbage Collection

String str = “Primeiro espaço”;System.out.println (“Usando memória original: “+str);str = “Outro espaço”;System.out.println (“Usando outro espaço de memória: “+str);

10 100str

Primeiro espaço

Outro espaço

10

100

Área de memória liberada pelo

Garbage Collection

System.gc(); Não obriga a limpar, mas “pede”para que o Garbage Collection limpe se possível

3

Page 4: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Listas: Tipo de Armazenamento

• O tipo de armazenamento de uma lista linear pode ser classificado de acordo com a posição relativa na memória de dois nós consecutivos na lista (sempre contígua ou não).

• Lista linear com alocação estática de memória– Também chamadas de Listas Sequenciais– Nós em posições contíguas de memória– Geralmente representado por arrays– Útil para implementar filas e pilhas (variáveis para controlar fim e

início)

• Lista linear com alocação dinâmica– Também chamadas de Listas Encadeadas– Posições de memória são alocadas a medida que são necessárias– Nós encontram-se aleatoriamente dispostos na memória e são interligados

por ponteiros, que indicam a próxima posição da tabela

• Nós precisam de um campo a mais: campo que indica o endereço do próximo nó.

4

Page 5: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Listas Simplesmente Encadeadas

• Uma lista simplesmente encadeada é uma sequência de objetos alocados dinamicamente, onde cada objeto faz referência ao seu sucessor na lista

• Lista encadeada básica:– possui variável head que referencia para o primeiro

elemento da lista– cada Objeto refere a seu sucessor– ultimo elemento contém a referência null (para

indicar que não referencia nenhum outro).

Ineficiente: se queremos inserir um elemento no final da lista, temos

que localizar o último elemento: para tanto é necessário percorrer todos os elementos da lista.

5

Page 6: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Lista Encadeada Básica

Node

element next

......

null final de lista

Apontador para o primeiro nó da lista

head

6

Page 7: Listas Simplesmente Encadeadas Professores de Programação II

Programação II

Lista encadeada com referência ao último elemento da lista

• Como tornar mais eficiente:– utilizar uma segunda variável, chamada tail, que

referencia o último elemento da lista.– eficiência obtida a custa do espaço adicional

Apontador para o primeiro nó da lista

......

headApontador para o último nó da lista

tail

null final de lista

7

Page 8: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 8

Classe Node

Node

element next

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node {

private String element; //assumimos que os elementos são stringsprivate Node next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(String s, Node n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( String element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public String getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(String newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node newNext){ next = newNext; }

}

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node {

private String element; //assumimos que os elementos são stringsprivate Node next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(String s, Node n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( String element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public String getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(String newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node newNext){ next = newNext; }

}

Page 9: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 9

Operações sobre lista

– public boolean isEmpty() • verifica se a lista está vazia

– public Node getFirst() • Retorna o primeiro elemento da lista, sem removê-lo

– public Node getLast() • Retorna o último elemento da lista, sem removê-lo

– public void addFirst( Node novoNodo ) • insere element na frente da lista

– public void addLast( Node novoNodo ) • insere element no final da lista

– public Node removeFirst() • remove e retorna o primeiro elemento da lista

– public Node removeLast() • remove e retorna o primeiro elemento da lista

– public void print()• exibe o conteúdo da lista

Page 10: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 10

/** Lista simplesmente encadeada **/public class SLinkedList {

protected Node head; //nodo cabeça da listaprotected Node tail; //nodo cauda da listaprotected long size; //número de nodos da lista/** Construtor default que cria uma lista vazia **/public SLinkedList(){

head = null;tail = null;size = 0;

}//demais métodos aqui

}

 

Class SLinkedList

Page 11: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 11

public boolean isEmpty(){return head == null;

}

public Node getFirst() throws UnderflowException {if (isEmpty()) throw new UnderflowException();return head;

}

public Node getLast() throws UnderflowException {if (isEmpty()) throw new UnderflowException();return tail;

}

public boolean isEmpty(){return head == null;

}

public Node getFirst() throws UnderflowException {if (isEmpty()) throw new UnderflowException();return head;

}

public Node getLast() throws UnderflowException {if (isEmpty()) throw new UnderflowException();return tail;

}

isEmpty(), getFirst() e getLast()

Page 12: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 12

Inserção em lista simplesmente encadeada

......

head- Na cabeça da lista:- Na cabeça da lista:

tail

......

head tail

......

head tail

a

b

c

Page 13: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 13

public void addFirst(Node novoNodo){novoNodo.setNext(head);head = novoNodo;size++;if(size == 1)

tail = head;}

- Na cabeça da lista:- Na cabeça da lista:

Inserção em lista simplesmente encadeada

Page 14: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 14

Inserção em lista simplesmente encadeada

......

head

- Na cauda da lista:- Na cauda da lista:tail

......

head tail

......

head tail

a

b

c

Page 15: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 15

- Na cauda da lista:- Na cauda da lista:

public void addLast(Node novoNodo){if(isEmpty())

addFirst(novoNodo);else{

novoNodo.setNext(null);tail.setNext(novoNodo);tail = novoNodo;size++;

}}

Inserção em lista simplesmente encadeada

Page 16: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 16

Remoção em lista simplesmente encadeada

......

head- Da cabeça da lista:- Da cabeça da lista:

tail

......

head tail

......

tail

a

b

c

head

Page 17: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 17

- Da cabeça da lista:- Da cabeça da lista:

public Node removeFirst() throws UnderflowException {if(isEmpty()) throw new UnderflowException();Node removedItem = head;if (head == tail) {

head = tail = null;} else {

head = head.getNext();}return removedItem;

}

Remoção em lista simplesmente encadeada

Page 18: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 18

- Da cauda da lista:- Da cauda da lista:

......

head tail

a

current current current current

......

head tail

b

current

Remoção em lista simplesmente encadeada

Page 19: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 19

- Da cauda da lista:- Da cauda da lista:

public Node removeLast() throws UnderflowException {if (isEmpty()) throw new UnderflowException();Node removedItem = tail;if (head == tail) {

head = tail = null;} else {

Node current = head;while (current.getNext() != tail) {

current = current.getNext();}tail = current;current.setNext(null);

}return removedItem;

}

Remoção em lista simplesmente encadeada

Page 20: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 20

public class UnderflowException extends Exception {public String toString() {

return "UNDERFLOW!";}

}

public class UnderflowException extends Exception {public String toString() {

return "UNDERFLOW!";}

}

Classe UnderflowException

Page 21: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 21

Exercício

Como imprimir a lista simplesmente encadeada?

a) Crie um método print(), que percorre a lista e imprime os elementos.

Page 22: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 22

public void print() {if (isEmpty()) {

System.out.println("Empty list");} else {

System.out.print("The list is: ");Node current = head;while (current != null) {

System.out.print(current.getElement().toString()+" ");current = current.getNext();

}Systemout.println("\n");

}}

Exercício - Resposta

Page 23: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 23

public static void main(String args[]){SLinkedList lista = new SLinkedList();try{

lista.addFirst(new Node("A"));lista.addFirst(new Node("B"));lista.addFirst(new Node("C"));lista.addLast(new Node("D"));lista.addLast(new Node("E"));lista.addLast(new Node("F"));lista.removeFirst();lista.removeLast();

}catch(UnderflowException e){System.out.println("ERRO: impossível remover!");e.printStackTrace();

}lista.print();

}

public static void main(String args[]){SLinkedList lista = new SLinkedList();try{

lista.addFirst(new Node("A"));lista.addFirst(new Node("B"));lista.addFirst(new Node("C"));lista.addLast(new Node("D"));lista.addLast(new Node("E"));lista.addLast(new Node("F"));lista.removeFirst();lista.removeLast();

}catch(UnderflowException e){System.out.println("ERRO: impossível remover!");e.printStackTrace();

}lista.print();

}

Testando a Lista Simplesmente Encadeada

Node n = new Node (“A”);Lista.addFirst (n);

Node n = new Node (“A”);Lista.addFirst (n);

Page 24: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 24

Exercício

Como inserir um elemento no meio de uma lista simplesmente encadeada?

a) Crie um método chamado addAfter(Node n, int pos), que insere o nodo n depois do nodo de número pos (considerando que o primeiro nodo é o nodo na posição 0).

b) Crie um método chamado addBefore(Node n, int pos), que insere o nodo n antes do nodo de número pos (considerando que o primeiro nodo é o nodo na posição 0).

Page 25: Listas Simplesmente Encadeadas Professores de Programação II

- Programação II 25

Exercício

Como fazer a lista ficar genérica?

a)Transforme a classe Node (que utiliza String) para um tipo genérico E

b)Transforme a classe SLinkedList para um tipo genérico E (o mesmo do Node)

Page 26: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 26

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node {

private String element; //assumimos que os elementos são stringsprivate Node next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(String s, Node n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( String element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public String getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(String newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node newNext){ next = newNext; }

}

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node {

private String element; //assumimos que os elementos são stringsprivate Node next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(String s, Node n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( String element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public String getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(String newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node newNext){ next = newNext; }

}

Classe Node com String

Page 27: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 27

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node<E>{

private E element;private Node<E> next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(E s, Node<E> n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( E element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public E getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node<E> getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(E newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node<E> newNext){ next = newNext; }

}

/** Nodo de uma lista simplesmente encadeada de strings **/public class Node<E>{

private E element;private Node<E> next;/** Cria um nodo com um dado elemento e o próximo nodo **/public Node(E s, Node<E> n){

element = s;next = n;

}/** Cria um nodo com um dado elemento e o próximo nodo em null**/public Node( E element ) {

this( element, null ); }/** Retorna o elemento deste nodo **/public E getElement(){ return element; }/** Retorna o próximo elemento deste nodo **/public Node<E> getNext(){ return next; }/** Define o elemento deste nodo **/public void setElement(E newElem){ element = newElem; }/** Define o próximo elemento deste nodo **/public void setNext(Node<E> newNext){ next = newNext; }

}

Classe Node Genérica

Page 28: Listas Simplesmente Encadeadas Professores de Programação II

Programação II 28

/** Lista simplesmente encadeada **/public class SLinkedList<E> {

protected Node<E> head; //nodo cabeça da listaprotected Node<E> tail; //nodo cauda da listaprotected long size; //número de nodos da lista/** Construtor default que cria uma lista vazia **/public SLinkedList(){

head = null;tail = null;size = 0;

}//demais métodos aqui

//todas as ocorrências do tipo Node devem ser alteradas para Node<E>}

/** Lista simplesmente encadeada **/public class SLinkedList<E> {

protected Node<E> head; //nodo cabeça da listaprotected Node<E> tail; //nodo cauda da listaprotected long size; //número de nodos da lista/** Construtor default que cria uma lista vazia **/public SLinkedList(){

head = null;tail = null;size = 0;

}//demais métodos aqui

//todas as ocorrências do tipo Node devem ser alteradas para Node<E>}

Classe SLinkedList Genérica

Page 29: Listas Simplesmente Encadeadas Professores de Programação II

Prof. Mateus Raeder - Programação II 29

Testando a Lista Simplesmente Encadeada Genérica

public static void main(String args[]){SLinkedList<String> lista = new SLinkedList<String>();try{

lista.addFirst(new Node<String>("A"));lista.addFirst(new Node<String>("B"));lista.addFirst(new Node<String>("C"));lista.addLast(new Node<String>("D"));lista.addLast(new Node<String>("E"));lista.addLast(new Node<String>("F"));//lista.addLast(new Node<Integer>(1));lista.removeFirst();lista.removeLast();lista.addAfter(new Node<String>("0"),3);lista.addBefore(new Node<String>("1"),4);lista.addBefore(new Node<String>("3"), 8);

}catch(IndexOutOfBoundsException e){System.out.println("ERRO: índice iválido!");e.printStackTrace();

}catch(UnderflowException e){System.out.println("ERRO: lista vazia, impossível remover!");e.printStackTrace();

}lista.print();

}

public static void main(String args[]){SLinkedList<String> lista = new SLinkedList<String>();try{

lista.addFirst(new Node<String>("A"));lista.addFirst(new Node<String>("B"));lista.addFirst(new Node<String>("C"));lista.addLast(new Node<String>("D"));lista.addLast(new Node<String>("E"));lista.addLast(new Node<String>("F"));//lista.addLast(new Node<Integer>(1));lista.removeFirst();lista.removeLast();lista.addAfter(new Node<String>("0"),3);lista.addBefore(new Node<String>("1"),4);lista.addBefore(new Node<String>("3"), 8);

}catch(IndexOutOfBoundsException e){System.out.println("ERRO: índice iválido!");e.printStackTrace();

}catch(UnderflowException e){System.out.println("ERRO: lista vazia, impossível remover!");e.printStackTrace();

}lista.print();

}