Executando verificação de segurança...
1

Qual a vantagem das listas encadeadas (linked lists) sobre os arrays?

Sendo bem direto: uso de memória.

Os arrays armazenam seus elementos em locais contínuos de memória. Por exemplo, se eu tenho um array com quatro elementos:

arr = [1, 2, 3, 4]

eu precisaria de 4 espaços contínuos de memória, ou seja, quatro espaços um do lado do outro para armazenar o array. Se esse array passasse a ter ter 10 elementos, eu precisaria procurar um lugar na memória que tivesse pelo menos 10 espaços disponíveis.

Por outro lado, as listas encadeadas (linked lists) funcionam de forma totalmente diferente. Se no array era preciso espaços contínuos de memória, na lista encadeada eu posso ter os elementos em qualquer lugar da memória.

Mas como eu relaciono esses elementos, se eles estão "perdidos" na memória, sem relacão nenhuma uns com os outros?

Cada nó da lista (ou seja, cada elemento da lista) deve possuir pelo menos duas propriedades obrigatórias: um valor e um ponteiro.

Digamos que eu tenha dois valores na lista: 2 e 5: o primeiro elemento da lista é o 2, portanto a sua estrutura seria algo parecido com Node(value: 2, next: 5). O 5 é o último elemento da lista, portanto não "aponta" para nenhum outro elemento, tendo seu ponteiro como nulo: Node(value: 5, next: None).

Entretanto, se a lista encadeada ganha em uso de memória, ela pode perder em performance, já que sempre que você quiser acessar um elemento da lista precisará percorrê-la por inteiro, diferentemento do array, que é possível acessar seus elementos através de índices.

Obs: Estou estudando sobre o assunto agora, então caso eu tenha deixado de explicar algo de forma correta, por favor, me corrija nos comentários!

Carregando publicação patrocinada...
2

Muito legal. Depois adiciona uns exemplos práticos com código para ajudar na profundidade do assunto. Esse é um dos 3 assuntos que mais considero importante no leque de um programador. Além de algoritmos e sistemas operacionais.

1

A lista ligada só vai gastar menos memória se eu não usar todo o espaço alocado do array.

Por exemplo, se eu declaro um array com 1000 elementos e só uso 10, claro que gasta mais memória que uma lista com apenas 10 elementos. Mas lembre-se que em uma lista, cada elemento tem também um ponteiro para o próximo.

Ou seja, se a lista tiver 500 elementos, os primeiros 499 elementos precisam ter um ponteiro para o próximo. Isso quer dizer que ela está usando 999 valores, praticamente o mesmo que o array.

Uma comparação mais justa é se o array está usando todos os 1000 espaços e a lista tem 1000 elementos. Aí o array gasta menos memória que a lista, pois esta precisa dos 1000 elementos, e os primeiros 999 também tem ponteiros para o próximo elemento.

No caso de precisar aumentar o array, claro que vc vai precisar alocar espaço novo e copiar tudo pra lá. Mas o espaço anterior pode ser liberado e reusado. Então não é que o array "gasta mais memória", na verdade o problema é que realocar dá mais trabalho, mas uma vez feito, na média vai gastar menos que a lista.

O array pode desperdiçar memória se vc não usa todo o espaço alocado. Se usar tudo, gasta menos que uma lista do mesmo tamanho.

O ponto é: se o programa vai ter poucas inserções ou vc já sabe que o tamanho é fixo, compensa usar o array. Se for o contrário, a lista passa a ser mais interessante.


O mesmo vale para a performance. A lista é mais rápida para inserir e remover elementos no meio (no array precisa "empurrar" todos pro lado, na lista vc só troca uns ponteiros).

Se vc tem muitas inserções ou remoções, a lista compensa mais. Se a busca é mais importante, o array passa a ser uma opção melhor.

De forma mais geral, toda estrutura de dados tem prós e contras, e cabe a vc avaliar qual atende melhor ao seu cenário.