listas (parte 1)

66
Tecnologia em Sistemas para Internet - IFMS Aula 04 – Listas (parte 1) Estruturas de Dados Prof.º Msc. Sidney Roberto de Sousa [email protected]

Upload: sidney-roberto

Post on 01-Jul-2015

822 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Listas (parte 1)

Tecnologia em Sistemas para Internet - IFMS

Aula 04 – Listas (parte 1)

Estruturas de DadosProf.º Msc. Sidney Roberto de Sousa

[email protected]

Page 2: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 2

O que veremos nesta aula?

● O que é uma lista?● Listas simples● Listas encadeadas● Listas duplamente encadeadas

Page 3: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 3

Lista

● Estrutura de dados abstrata e linear que implementa uma coleção finita e ordenada de valores

● Cada instância de um valor na lista é chamado de ítem (ou elemento) da lista

Page 4: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 4

Propriedades de uma lista

● Tamanho: Número de itens armazenados na lista.● Índice: Cada elemento na lista possui um índice, ou seja, um

número que o identifica.● Tipo(*): Toda lista possui um tipo. Assim, todo item da lista possui

o mesmo tipo.● Igualdade: Uma lista a é igual a uma outra lista b se e somente se,

para cada índice i de a e b, ai é igual a bi quanto aos seus valores e estruturas.

(* Na verdade, tanto na linguagem Java quanto na maioria das linguagens modernas, uma lista pode conter itens de tipos variados. Manteremos esta definição por enquanto apenas por conveniência aos nossos estudos.)

Page 5: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 5

Listas simples

● Listas simples ou listas estáticas são listas que permitem a adição de um número limitado de itens → tamanho invariável

● Neste tipo de lista, o acesso a um item situado em um determinado índice é feito de forma rápida e prática

● Listas simples podem ser implementadas como matrizes unidimensionais (vetores)

Page 6: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 6

Exemplo: Lista simples

Classe ListaSimples

(abaixo no blog)

Page 7: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 7

Inserção em uma lista simples

public boolean adicionarItem(Integer novoItem, int indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {        lista[indiceDoItem] = novoItem;

        return true;

    }

    return false;

}

Page 8: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 8

Inserção em uma lista simples

public boolean adicionarItem(Integer novoItem, int indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {        lista[indiceDoItem] = novoItem;

        return true;

    }

    return false;

}

Verifica se a posição desejada para o armazenamento do novo elemento é válida.

Page 9: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 9

Inserção em uma lista simples

public boolean adicionarItem(Integer novoItem, int indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {

        lista[indiceDoItem] = novoItem;

        return true;

    }

    return false;

}

Se a posição for válida, o novo elemento é inserido na posição desejada. Caso já haja um outro elemento nesta posição, tal elemento é sobreposto pelo novo elemento. O método retorna o valor true, indicando que o elemento foi inserido com sucesso.

Page 10: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 10

Inserção em uma lista simples

public boolean adicionarItem(Integer novoItem, int indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {        lista[indiceDoItem] = novoItem;

        return true;

    }

    return false;

}

Se a posição for inválida, o método retorna o valor false, indicando que o elemento não foi inserido.

Page 11: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 11

Remoção em uma lista simples

public Integer removerItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho

        && lista[indiceDoItem] != null) {

        Integer itemRemovido = lista[indiceDoItem];

        lista[indiceDoItem] = null;

        return itemRemovido;

    }

    return null;

}

Page 12: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 12

Remoção em uma lista simples

public Integer removerItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho

        && lista[indiceDoItem] != null) {

        Integer itemRemovido = lista[indiceDoItem];

        lista[indiceDoItem] = null;

        return itemRemovido;

    }

    return null;

}

Verifica se existe algum elemento a ser removido na posição desejada. Também verifica se tal posição é válida.

Page 13: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 13

Remoção em uma lista simples

public Integer removerItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho

        && lista[indiceDoItem] != null) {

        Integer itemRemovido = lista[indiceDoItem];

        lista[indiceDoItem] = null;

        return itemRemovido;

    }

    return null;

}

Caso a posição informada seja válida e exista algum elemento a ser removido, o elemento é “removido” ao se substituir o seu valor pelo valor null. Por fim, o método retorna o valor do item recém removido.

Page 14: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 14

Remoção em uma lista simples

public Integer removerItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho

        && lista[indiceDoItem] != null) {

        Integer itemRemovido = lista[indiceDoItem];

        lista[indiceDoItem] = null;

        return itemRemovido;

    }

    return null;

}

Caso a posição informada seja inválida ou não exista um elemento a ser removido, o método retorna o valor null.

Page 15: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 15

Pegando um elemento de uma lista simples

public Integer pegarItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {

        return lista[indiceDoItem];

    }

    return null;

}

Page 16: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 16

Pegando um elemento de uma lista simples

public Integer pegarItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {

        return lista[indiceDoItem];

    }

    return null;

}

Primeiramente, o método verifica se a posição do item desejado é válida.

Page 17: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 17

Pegando um elemento de uma lista simples

public Integer pegarItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {

        return lista[indiceDoItem];

    }

    return null;

}

Se a posição é válida, o elemento desejado é retornado. Note que o acesso ao elemento da lista é realizado diretamente por meio do uso do índice correto. Caso nenhum elemento tenha sido adicionado nesta posição, o valor null é retornado.

Page 18: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 18

Pegando um elemento de uma lista simples

public Integer pegarItem(Integer indiceDoItem) {

    if (indiceDoItem >= 0 && indiceDoItem < tamanho) {

        return lista[indiceDoItem];

    }

    return null;

}

Se a posição é inválida, o método retorna o valor null.

Page 19: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 19

Utilizando a classe ListaSimples

ListaSimples listaSimples = new ListaSimples(10);

listaSimples.adicionarItem(8, 0);

listaSimples.adicionarItem(­7, 5);

listaSimples.adicionarItem(98, 9);

listaSimples.adicionarItem(7, 5);

listaSimples.adicionarItem(123, 6);

listaSimples.removerItem(5);

listaSimples.removerItem(2);

for (int i = 0; i < listaSimples.tamanhoDaLista(); i++) {

    System.out.print(listaSimples.pegarItem(i) + " ");

}

/*

 * Imprime na tela:

 * 8 null null null null null 123 null null 98 

 */

Page 20: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 20

Listas encadeadas

● Listas encadeadas ou listas ligadas são listas dinâmicas que permitem a adição de um número teoricamente ilimitado de itens

● Neste tipo de lista, o acesso aos itens não é realizado diretamente por meio de um índice

● Cada elemento da lista possui um link para o próximo elemento da lista

Page 21: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 21

Exemplo: Lista encadeada

Classes No e ListaEncadeada

(abaixo no post)

Page 22: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 22

Classe No

public class No {

    private Integer item;

    private No proximoItem;

    public No() {

        proximoItem = null;

    }

    // Getters e setters para os atributos da classe...

}

Page 23: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 23

Classe No

public class No {

    private Integer item;

    private No proximoItem;

    public No() {

        proximoItem = null;

    }

    // Getters e setters para os atributos da classe...

}

Encapsula um item na lista encadeada

Page 24: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 24

Classe No

public class No {

    private Integer item;

    private No proximoItem;

    public No() {

        proximoItem = null;

    }

    // Getters e setters para os atributos da classe...

}

Armazena o valor do item

Page 25: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 25

Classe No

public class No {

    private Integer item;

    private No proximoItem;

    public No() {

        proximoItem = null;

    }

    // Getters e setters para os atributos da classe...

}

Ponteiro (link) para o próximo item da lista encadeada

Page 26: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 26

Classe No

public class No {

    private Integer item;

    private No proximoItem;

    public No() {

        proximoItem = null;

    }

    // Getters e setters para os atributos da classe...

}

Construtor da classe No. Inicializa o atributo proximoItem com o valor null. Isto indica que inicialmente o item não estão ligado a um próximo item.

Page 27: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 27

Representação da lista encadeada

item

pro

xim

oIt

em

item

pro

xim

oIt

em

item

pro

xim

oIt

em

item

pro

xim

oIt

em

No No No No

Page 28: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 28

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Page 29: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 29

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Encapsula uma lista encadeada, onde cada item da lista é encapsulado pela classe No. Contém as operações sobre a lista.

Page 30: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 30

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Guarda o tamanho da lista, ou seja, o número de ítens contidos nela.

Page 31: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 31

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Guarda o primeiro item da lista.

Page 32: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 32

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Guarda o último item da lista.

Page 33: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 33

Classe ListaEncadeada

public class ListaEncadeada {

    private int tamanho;

    private No primeiroItem;

    private No ultimoItem;

   

    public ListaEncadeada() {

        primeiroItem = null;

        ultimoItem = null;

        tamanho = 0;

    }

    // Restante da classe...

}

Construtor da classe ListaEncadeada. Inicializa os atributos da classe, sinalizando que a lista ainda não possui elementos.

Page 34: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 34

Inserindo um novo item no início

public void adicionarNoInicio(Integer novoItem) {

    if (tamanho == 0) {

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        ultimoItem = primeiroItem;

    } else {

        No antigoPrimeiroItem = primeiroItem;

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        primeiroItem.setProximoItem(antigoPrimeiroItem);

    }

    tamanho++;

}

Page 35: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 35

Inserindo um novo item no início

public void adicionarNoInicio(Integer novoItem) {

    if (tamanho == 0) {

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        ultimoItem = primeiroItem;

    } else {

        No antigoPrimeiroItem = primeiroItem;

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        primeiroItem.setProximoItem(antigoPrimeiroItem);

    }

    tamanho++;

}

Caso a lista esteja vazia, um novo item é criado com o valor desejado. O novo item se torna o primeiro e o último item da lista simultaneamente.

Page 36: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 36

Inserindo um novo item no início

public void adicionarNoInicio(Integer novoItem) {

    if (tamanho == 0) {

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        ultimoItem = primeiroItem;

    } else {

        No antigoPrimeiroItem = primeiroItem;

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        primeiroItem.setProximoItem(antigoPrimeiroItem);

    }

    tamanho++;

}

Caso a lista não esteja vazia, um novo item é criado com o valor desejado. O novo item se torna o primeiro item da lista.

Page 37: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 37

Inserindo um novo item no início

public void adicionarNoInicio(Integer novoItem) {

    if (tamanho == 0) {

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        ultimoItem = primeiroItem;

    } else {

        No antigoPrimeiroItem = primeiroItem;

        primeiroItem = new No();

        primeiroItem.setItem(novoItem);

        primeiroItem.setProximoItem(antigoPrimeiroItem);

    }

    tamanho++;

}

Após o item ser inserido, o tamanho da lista é incrementado em uma unidade.

Page 38: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 38

Inserindo um novo item no final

public void adicionarNoFinal(Integer novoItem) {

    if (tamanho == 0) {

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        primeiroItem = ultimoItem;

    } else {

        No antigoUltimoItem = ultimoItem;

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        antigoUltimoItem.setProximoItem(ultimoItem);

    }

    tamanho++;

}

Page 39: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 39

Inserindo um novo item no final

public void adicionarNoFinal(Integer novoItem) {

    if (tamanho == 0) {

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        primeiroItem = ultimoItem;

    } else {

        No antigoUltimoItem = ultimoItem;

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        antigoUltimoItem.setProximoItem(ultimoItem);

    }

    tamanho++;

}

Caso a lista esteja vazia, um novo item é criado com o valor desejado. O novo item se torna o primeiro e o último item da lista simultaneamente.

Page 40: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 40

Inserindo um novo item no final

public void adicionarNoFinal(Integer novoItem) {

    if (tamanho == 0) {

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        primeiroItem = ultimoItem;

    } else {

        No antigoUltimoItem = ultimoItem;

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        antigoUltimoItem.setProximoItem(ultimoItem);

    }

    tamanho++;

}

Caso a lista não esteja vazia, um novo item é criado com o valor desejado. O novo item se torna o último item da lista.

Page 41: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 41

Inserindo um novo item no final

public void adicionarNoFinal(Integer novoItem) {

    if (tamanho == 0) {

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        primeiroItem = ultimoItem;

    } else {

        No antigoUltimoItem = ultimoItem;

        ultimoItem = new No();

        ultimoItem.setItem(novoItem);

        antigoUltimoItem.setProximoItem(ultimoItem);

    }

    tamanho++;

}

Após o item ser inserido, o tamanho da lista é incrementado em uma unidade.

Page 42: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 42

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Page 43: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 43

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Se a posição desejada for válida, então o novo item pode ser inserido.

Page 44: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 44

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Se a primeira posição for a desejada, então o método de inserção de itens no início da lista é chamado.

Page 45: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 45

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Se a última posição for a desejada, então o método de inserção de itens no final da lista é chamado.

Page 46: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 46

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Se a posição desejada não for a primeira nem a última, então o método percorre a lista encadeada até encontrar a posição desejada. Por fim, o item é inserido na posição correta.

Page 47: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 47

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Se o item foi inserido com sucesso, o método retorna o valor true indicando o fato.

Page 48: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 48

Inserindo um novo item em qualquer posiçãopublic boolean adicionarNaPosicao(Integer novoItem, int posicao) {

    if (posicao >= 1 && posicao <= tamanho + 1) {

        if (posicao == 1) {

            adicionarNoInicio(novoItem);

        } else if (posicao == tamanho + 1) {

            adicionarNoFinal(novoItem);

        } else {

            No novoNo = new No();

            novoNo.setItem(novoItem);

            int contador = 1;

            No itemAnteriorAoNovo = primeiroItem;

            while (contador < posicao ­ 1) {

                itemAnteriorAoNovo = itemAnteriorAoNovo.getProximoItem();

                contador++;

            }

            novoNo.setProximoItem(itemAnteriorAoNovo.getProximoItem());

            itemAnteriorAoNovo.setProximoItem(novoNo);

            tamanho++;

        }

        return true;

    }

    return false;

}

Caso contrário, a posição desejada era inválida e portanto o item não foi inserido. Assim, o método retorna o valor false indicando tal fato.

Page 49: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 49

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Page 50: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 50

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Se a posição é válida, ou seja, existe um item em tal posição, então o item pode ser removido.

Page 51: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 51

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

O item a ser removido é encontrado.

Page 52: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 52

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

       if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Se o item a ser removido não for o primeiro, então o seu vizinho anterior é ligado ao seu vizinho posterior.

Page 53: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 53

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Se o item a ser removido for o primeiro, então o seu vizinho posterior se torna o novo primeiro item da lista.

Page 54: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 54

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Após o item ser removido, o tamanho da lista é decrementado em uma unidade. Se a lista ficou vazia, então os ponteiros do primeiro e último itens apontam para null. Se a lista ficou com apenas um item, então os ponteiros do primeiro e último ítens apontam para o único item da lista. Se o item foi removido com sucesso, o valor true é retornado indicando tal fato.

Page 55: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 55

Removendo um itempublic boolean remover(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        No anterior = null;

        int contador = 1;

        while (contador < posicao) {

            anterior = item;

            item = item.getProximoItem();

            contador++;

        }

        No proximo = item.getProximoItem();

        if (anterior != null) {

            anterior.setProximoItem(proximo);

        } else {

            primeiroItem = proximo;

        }

        tamanho­­;

        if (tamanho <= 1) {

            primeiroItem = proximo;

            ultimoItem = primeiroItem;

        }

        return true;

    }

    return false;

}

Se a posição for inválida, então o valor false é retornado indicando tal fato.

Page 56: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 56

Pegando um item da listapublic No pegarItem(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        int contador = 1;

        while (posicao < contador) {

            item = item.getProximoItem();

            contador++;

        }

        return item;

    }

    return null;

}

Page 57: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 57

Pegando um item da listapublic No pegarItem(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        int contador = 1;

        while (posicao < contador) {

            item = item.getProximoItem();

            contador++;

        }

        return item;

    }

    return null;

}

Se a posição é válida, ou seja, existe um item em tal posição, então o item pode ser retornado.

Page 58: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 58

Pegando um item da listapublic No pegarItem(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

       int contador = 1;

       while (posicao < contador) {

           item = item.getProximoItem();

           contador++;

       }

       return item;

    }

    return null;

}

A lista encadeada é percorrida até se chegar na posição desejada. Quando a posição é alcançada, então o item correto é retornado.

Page 59: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 59

Pegando um item da listapublic No pegarItem(int posicao) {

    if (tamanho > 0 && posicao >= 1 && posicao <= tamanho) {

        No item = primeiroItem;

        int contador = 1;

        while (posicao < contador) {

            item = item.getProximoItem();

            contador++;

        }

        return item;

    }

    return null;

}

Se a posição desejada for inválida, então o valor null é retornado.

Page 60: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 60

Utilizando a classe ListaEncadeada

ListaEncadeada listaEncadeada = new ListaEncadeada();

listaEncadeada.adicionarNoInicio(­13);

listaEncadeada.adicionarNoInicio(78);

listaEncadeada.adicionarNoInicio(19823);

listaEncadeada.adicionarNoFinal(500);

listaEncadeada.adicionarNaPosicao(457, 2);

No item = listaEncadeada.pegarItem(1);

// Imprime na tela:

// 19823 457 78 ­13 500

while (item != null) {

    System.out.print(item.getItem() + " ");

    item = item.getProximoItem();

}

Page 61: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 61

Listas duplamente encadeadas

● Similares às listas encadeadas● Porém, cada item possui um ponteiro para os

ítens anterior e posterior a si na lista

Page 62: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 62

Representação da lista duplamente encadeada

item

pro

xim

oIt

em

item

pro

xim

oIt

em

item

pro

xim

oIt

em

item

pro

xim

oIt

em

No No No No

ite

mA

nte

rio

r

item

An

teri

or

ite

mA

nte

rio

r

item

An

teri

or

Page 63: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 63

Exemplo: Lista duplamente encadeada

Classes NoDuplo e ListaDuplamenteEncadeada

(abaixo no post)

Page 64: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 64

Exemplo: Lista duplamente encadeada

Classes NoDuplo e ListaDuplamenteEncadeada

(abaixo no post)?

Page 65: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 65

Exercício

Implemente as classes NoDuplo e ListaDuplamenteEncadeada.

Page 66: Listas (parte 1)

Tec. em Sistemas para Internet - IFMS 66

That's not all, folks!

Na próxima aula falaremos mais sobre listas, mas de uma forma mais suave...