Listas Simplesmente Encadeadas Professores de Programação II

Preview:

Citation preview

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

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

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

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

Programação II

Lista Encadeada Básica

Node

element next

......

null final de lista

Apontador para o primeiro nó da lista

head

6

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

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; }

}

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

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

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()

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

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

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

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

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

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

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

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

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

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.

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

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);

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).

- 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)

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

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

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

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();

}

Recommended