Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
msr

Eliminar metade dos elementos numa LinkedList

Recommended Posts

msr

Olá,

Queria eliminar metade dos elementos duma LinkedList. Como é que o posso fazer?

Por exemplo:

lista.size() == 10

Teriam que ficar apenas os 5 primeiros.

Como a lista é ligada basta percorrer até ao elemento do meio (neste caso o 5º elemento) e colocar o próximo a NULL, certo? No entanto não estou a ver como é que isso se faz através dos métodos que a classe tem disponíveis. Será com um Iterator? Mesmo assim não estou a ver como fazer.

Se me pudessem dar um exemplo de código era o ideal.

Obrigado!

Share this post


Link to post
Share on other sites
Knitter

Colocar o próximo elemento? Isso é comum em C, em Java não tens acesso ao "próximo elemento".

Terás de colocar todos os elementos a partir de determinado indíce como null. Mas isso não reduz o tamanho da lista, apenas diz que os elementos a partir de determinada posição são null.

A forma mais simples, é percorrer os elementos da lista que queres manter, com iterador ou com foreach, e colocar esses elementos numa lista nova, no fim fazer a atribuição das variáveis de acordo com o que precisares.

Não há forma de tornar a lista mais curta.

Share this post


Link to post
Share on other sites
msr

Eu realmente venho de C e a minha experiencia com listas em Java é praticamente nula, daí a confusão.

Se calhar devia ter escrito "remover" em vez de "eliminar". O que eu quero é remover elementos dessa lista.

A lista está ordenada e o que eu quero é deixar apenas os "lista.size() / 2" primeiros.

O que dizes é criar uma nova instancia de LinkedList, copiar para ela os elementos que quero manter e depois trocar as referências das listas?

Não há forma mais "natural" de fazer isto em Java? (ie, sem recorrer a uma lista auxiliar)

Obrigado

Share this post


Link to post
Share on other sites
vasco16

Olá,

Queria eliminar metade dos elementos duma LinkedList. Como é que o posso fazer?

Por exemplo:

lista.size() == 10

Teriam que ficar apenas os 5 primeiros.

Como a lista é ligada basta percorrer até ao elemento do meio (neste caso o 5º elemento) e colocar o próximo a NULL, certo? No entanto não estou a ver como é que isso se faz através dos métodos que a classe tem disponíveis. Será com um Iterator? Mesmo assim não estou a ver como fazer.

Se me pudessem dar um exemplo de código era o ideal.

Obrigado!

Hum..

lista.size() == 10

//tens de te ter em atencao os numeros pares/impares do size

for(int i = lista.size()/2; i < lista.size(); i++){

lista.remove(i);

}

Share this post


Link to post
Share on other sites
Knitter

Se calhar devia ter escrito "remover" em vez de "eliminar". O que eu quero é remover elementos dessa lista.

Para remover basta usares o método remove(int) das listas ou o remove(object) conforme o tipo de remoção, isto é, se tens o índice ou se tens o objecto que queres remover.

Não há forma mais "natural" de fazer isto em Java? (ie, sem recorrer a uma lista auxiliar)

Esta seria uma forma natural já que tem em conta o princípio de encapsulamento de objectos. Na verdade não sabes se a lista é duplamente ligada, se é uma lista com cabeça e cauda (ou lá como chamam a uma lista com máximo e mínimo), se é implementada com um array se usa outras estruturas, enfim. O que sabes é que uma LinkedList, por exemplo, implementa uma lista ligada seguindo a interface List, não sabes sequer se há noção de nó, de próximo ou de anterior na implementação interna.

Em C é normal aceder ao próximo elemento ou ao elemento anterior, porque efectivamente, são dois ponteiros a que tens acesso. Em Java, e tendo em conta o principio de encapsulamento de informação, nunca terás acesso a esses dados. Se reparares uma estrutura dá-te sempre métodos para acederes aos teus dados, nunca à organização interna.

Mas se queres simplesmente remover, podes fazer como o vasco16 disse, dependendo do tipo de List, vai funcionar. Para implementações que tenham noção de tamanho e de número de elementos podes ter de alterar o método que te diz quantos elementos lá estão dentros, por exemplo em ArrayList.

No caso de usares iteradores, podes usar o método remove() do iterador, que remove o elemento actual. Atenção que não podes alterar a estrutura de uma lista (remover e inserir elementos) se a estiveres a percorrer.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.