LinkedList ajuda

12 respostas
J

Boas
Estou a iniciar-me a trabalhar com as LinkedList,e gostava de saber como posso remover duas posiçoes da lista,e saber quais os elemntos que estao antes e depois.
Obrigado

12 Respostas

Kassiane_Pretti

Já vi alguns topicos sobre o assunto aqui no forum…

http://www.guj.com.br/jforum.java?module=search&action=search&search_keywords=LinkedList&match_type=all&search_forum=&sort_by=relevance

ViniGodoy

Para remover use o método remove.
Antes e depois do que?

FelipeGeorge13

jlity:
Boas
Estou a iniciar-me a trabalhar com as LinkedList,e gostava de saber como posso remover duas posiçoes da lista,e saber quais os elemntos que estao antes e depois.
Obrigado

ola , eh o seguinte… veja o exemplo:

LinkedList lista = new LinkedList();

lista.add();

lista.addFirst();

lista.addLast();

lista.remosve(int);

lista.removeFirst();

lista.removeLast();
J

E como posso saber qual o objecto que está a seguir ao objecto que removi??

B

Se você removeu o primeiro, o próximo, se houver, é o primeiro.

Se você removeu o n, o próximo, se houver, é o n.

Se você removeu o último, não tem próximo.

J

Visto que ninguem percebeu aqui vai o que pretendo fazer :stuck_out_tongue:

Em um metodo recebo como parametros a cabeça de uma lista e 2 numeros inteiros que vao corresponder a posiçoes da lista,e pretendo remover todos os objectos entre essas duas posiçoes tal como eles proprios. returnando a nova cabeça da lista.
Se alguem me puder dar uma ajudinha ae

albertoivo

nesse caso é melhor vc usar uma ArrayList(), que vc vai direto no índice dos elementos que quer remover…

J

O problema é que é passado como parametro a cabeça de uma linkedlist

B

Você está resolvendo um exercício ou trabalhando num programa de verdade?

Pois é estranho receber só cabeça de uma lista, não há vantagem alguma nessa implementação.

J

é mesmo um exercicio

ViniGodoy
jlity:
Em um metodo recebo como parametros a cabeça de uma lista e 2 numeros inteiros que vao corresponder a posiçoes da lista,e pretendo remover todos os objectos entre essas duas posiçoes tal como eles proprios. returnando a nova cabeça da lista. Se alguem me puder dar uma ajudinha ae

Use para isso um listIterator. Você deve iterar de trás para frente na lista, já que a remoção de um objeto alterará os índices dos posteriores.

Aqui vai um código de exemplo:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class Main {
    public static <T> void remove(List<T> list, int begin, int end) {
        if (end > list.size()) {
            throw new IllegalArgumentException("End (" + end + ") maior que a lista (" + list.size() + ")!");
        }

        if (begin > end) {
            throw new IllegalArgumentException("Begin deve ser menor ou igual ao end!");
        }

        if (begin < 0) {
            throw new IllegalArgumentException("Begin deve ser maior ou igual a zero");
        }
        
        //Pegamos um iterador posicionado no fim.
        ListIterator<T> it = list.listIterator(end+1);
        while (it.hasPrevious()) {
            //Já chegou antes do início? Hora de parar
            if (it.previousIndex() < begin)
                break;
            
            //Iteramos para trás e removemos.
            it.previous();
            it.remove();
        }
    }

    public static void main(String[] args) {
        List<String> teste = new ArrayList<String>(Arrays.asList("Banana", "laranja", "limão", "maçã", "pêra", "jaca"));
        remove(teste, 1, 3); //Remove laranja, limão e maçã
        System.out.println(teste);
    }
}
ViniGodoy

No caso de ter que percorrer uma linked list pura, pela cabeça, faça o seguinte:

public void remove(Node cabeca, int begin, int end) {  
   //mesmas validações anteriores
   int currentIndex = 0;
   Node currentNode = cabeca;

   //vamos andar até a posição a ser removida
   while (currentIndex <= end) {
      if (currentIndex < begin) { //Ainda não chegou a hora de remover?
         currentNode = currentNode.next; //Então pula pro próximo
      } else { //Se está na hora, remove e considera que andou na lista.
         remove(currentNode); //É importante que esse método posicione a lista no nextNode.
         currentNode++;
      }
   }
}

Esse método funciona para listas duplamente ou simplesmente encadeadas.

Criado 20 de junho de 2008
Ultima resposta 22 de jun. de 2008
Respostas 12
Participantes 6