DEV Community

Wagner Abrantes
Wagner Abrantes

Posted on

1

Single Linked Lists

Você pode chamar de lista ligada, lista encadeada, eu vou chamar de linked list.

A grande diferença linked list e arrays é que linked list não são indexadas, não tem como buscar o sexto elemento, ou o segundo e etc. A linked list funciona como estações do monotrilho, onde cada estação é um valor e existe uma conexão entre uma estação e outra, formando uma linha.

E por isso podemos declarar a Linked list como uma estrutura de dados linear.

O exemplo com o monotrilho é bem específico exatamente porque vou falar de doubly linked list também e essa tem mais a ver com linhas de metrô.

N_a linked list_ cada Node ou nó irá representar uma estação, cada node tem uma propriedade que pode ser um int, string ou qualquer outro tipo. Nesse caso será uma string e a propriedade são as estações do monotrilho.

A segunda parte de um Node é um ponteiro que faz a ligação apontando para o próximo node, no nosso exemplo, a próxima estação, criando assim uma ligação entre todos os nós.

No nosso exemplo enquanto os Nodes são as estações, o Monotrilho vai representar a própria linked list.

Outras duas partes importante nas linked list são o headNode e o tail o head é o primeiro item que entra na lista e o tail o último, no caso do tail o pointer dele aponta para nil, o que representa o fim da lista. Essas duas partes também são importantes pois são referência para a criação dos métodos que precisaremos usar na linked list.

Claro que uma estrutura da de dados não é nada seus seus métodos, e vamos implementá-los aqui. Para entender por completo é necessário que você saiba como usar ponteiros, então vou deixar alguns recursos aqui pra você consultar antes de começar a falar de código.

Go by Example: Pointers

Aprenda Go: O que são ponteiros?

A estrutura

O struct Estação é o que vai representar os nós dessa Linked List, então temos a propriedade que é o valor nome e proximaEstacao que faz a ligação entre os nós apontando para o próximo Node.

Com a struct Monotrilho temos agora como setar a primeiraEstacao (head) que é onde começa a linked list, então primeiraEstacao vai apontar para Estacao (Node) que é onde fica a proximaEstacao.

Adicionar um head

O método AddPrimeiraEstacao vai adicionar um valor ao primeiro Node que é primeiraEstacao.

AddPrimeiraEstacao usa a struct Monotrilho como receiver e possui um parâmetro string. Instanciamos Estacao e atribuímos o parâmetro a propriedade nome.

Agora linha.primeiraEstacao recebe a referencia de memória presente na Estacao instanciada.

IterateList

Basicamente o que faríamos com um for statement em um array porém usando as propriedades das structs para percorrer a lista de Estações.

Enquanto a Estacao instanciada for diferente de nil (representação do fim da lista) estacao é igual a proximaEstacao análogo ao i++.

LastNode

O método UltimaEstacao do Monotrilho retorna o node no final da linha. A linha é percorrida para verificar se proximaEstacao é nil caso seja a variável ultimaEstacao recebe o valor atual de estacao feito no for.

AddToEnd

O método AdicionaEstacao adiciona um node no final da linha.

Primeiro buildamos um Node, nome = parâmetro e o proximaEstacao que recebe nil pois como essa estação é adicionada no final da linha ela precisa ser um tail.

Em seguida encontramos o fim da linha atual reutilizando UltimaEstacao() o método criado anteriormente e setamos seu valor com o a estacao criada.

NodeWithValue

O método ProcuraEstacao do Monotrilho retorna o node com o valor do parâmetro. A lista é percorrida e verificada para ver se o valor da propriedade é igual ao parâmetro caso contrário retorna nil.

AddAfter

O método AddProximaEstacao adiciona um Node após uma Estacao específica.

O método AddProximaEstacao do Monotrilho possui dois parâmetros, onde o primeiro é o node de referencia e o segundo o novo node a ser adicionado na posição seguinte a referência.

Uma estacao com o valor nomeDaEstacaoAnterior é recuperada reutilizando o método ProcuraEstacao().

Um node (parâmetro 2) é criado e adicionada após o retorno de ProcuraEstacao().

RemoveNode

O método RemoveEstacao verifica se o primeiraEstacao é nil, caso o Monotrilho esteja vazio.

Em seguida se a propriedade do primeiraEstacao for a mesma do parâmetro então proximaEstacao é movido para primeiraEstacao assim ocupando a posição do Node removido.

Em seguida uma nova condição onde estacaoAtual é setada como head para que possamos verificar os itens além da primeiraEstacao e assim caso seja encontrado fazemos a atribuição para a esquerda novamente alocando os nodes seguintes a posição do node removido.

SizeList

TamanhoDaLinha faz o mesmo papel que len() em estruturas de array retornando a quantidade de Nodes presentes no Monotrilho.

FuncMain

Depois disso tudo você pode utilizar os métodos para construir a sua LinkedList como preferir.

Output

<<<<<<< HEAD

A versão em código no repositório não utiliza a os mesmos exemplos com o Monotrilho, os nomes no arquivo original contam com os nomes comuns usados na estrutura de LinkeList.

A versão em código no repositório não utiliza a os mesmos exemplos com o Monotrilho, os nomes no arquivo original contam com os nomes comuns usados na estrutura de LinkeList.

LinkedList vs Arrays

  • Um array é a estrutura de dados que contém uma coleção de elementos de dados de tipo semelhante, enquanto a linked list é considerada como uma estrutura de dados não primitiva contém uma coleção de elementos vinculados não ordenados conhecidos como nodes.

  • No array, os elementos pertencem a índices, ou seja, se você deseja o quarto elemento, deve escrever o nome da variável com seu índice ou localização dentro do colchete.

  • Em uma linked list, porém, você tem que começar do head e ir trabalhando até chegar ao quarto elemento. O acesso a um elemento em um array é rápido, enquanto a linked list leva um tempo linear, portanto, é um pouco mais lento.

  • Operações como insert e delete em arrays consomem muito tempo. Por outro lado, o desempenho dessas operações em linked lists é rápido.

  • Arrays são de tamanho fixo. Em contraste, as linked lists são dinâmicas e flexíveis e podem expandir e diminuir seu tamanho.

  • Em um array, a memória é atribuída durante o tempo de compilação, enquanto uma linked list é alocada em tempo de execução.

  • Os elementos são armazenados consecutivamente na memória com arrays, enquanto que são armazenados aleatoriamente em linked lists.

Tudo em relação as estruturas terão tradeoff então a aplicação de cada uma vai depender da necessidade do desenvolvedor.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay