Recapitulação - Construtor de Lista Ligada
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 24 de 107.
Desafio
FácilVamos criar uma lista encadeada do zero! Você criará uma estrutura de dados em que cada nó aponta para o próximo, formando uma cadeia de valores conectados na memória.
Você organizará seu código em dois arquivos:
linkedlist.go: defina uma estruturaNodecom os camposValue(int) eNext(*Node). Crie uma estruturaLinkedListque mantenha um ponteiro para o nóHead. Implemente estes métodos em*LinkedList:Append- adiciona um novo nó com o valor fornecido ao final da listaPrepend- adiciona um novo nó com o valor fornecido ao início da listaPrint- percorre a lista e imprime todos os valores separados por->, terminando comnil
main.go: leia os valores da entrada, crie uma lista encadeada adicionando e antepondo nós e, em seguida, imprima a estrutura final da lista.
As seguintes entradas serão fornecidas:
- Linha 1: primeiro valor a ser adicionado ao final
- Linha 2: segundo valor a ser adicionado ao final
- Linha 3: valor a ser adicionado ao início
Seu método Print deve produzir a lista neste formato:
[value1] -> [value2] -> [value3] -> nilPor exemplo, dados 10, 20 e 5, sua saída deve ser:
5 -> 10 -> 20 -> nilO método Append precisa percorrer a lista até o final (onde Next é nil) antes de adicionar o novo nó. O método Prepend deve criar um novo nó, fazer seu Next apontar para o início atual e, em seguida, atualizar o início para o novo nó. Lembre-se de que uma lista vazia tem um início nil, portanto trate esse caso no método Append.
Experimente você mesmo
package main
import "fmt"
func main() {
// Ler valores de entrada
var val1, val2, val3 int
fmt.Scanln(&val1)
fmt.Scanln(&val2)
fmt.Scanln(&val3)
// Criar uma nova lista encadeada
list := &LinkedList{}
// TODO: Use Append para adicionar val1 e val2 à lista
// TODO: Use Prepend para adicionar val3 ao início da lista
// TODO: Imprimir a estrutura final da lista
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosWorkspace e Módulos do GoPacotes e ImportsNomes Exportados vs. Não ExportadosIntrodução à OOP em GoStructs como ClassesDefinindo Métodos em StructsReceptores de Ponteiro vs. de ValorInicialização de StructsFunções ConstrutorasRecapitulação — Calculadora Simples4Interfaces
Introdução às InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Asserção de TipoSwitch de TipoComposição de InterfacesInterfaces Stringer e ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs. Não ExportadosEncapsulamento no Nível de PacoteMétodos Getters e SettersOcultação de Informações em GoRecapitulação - Registros de Alunos10Genéricos (Go 1.18+)
Introdução aos genéricosParâmetros de tipoRestrições de tipoStructs genéricasAlternativa para métodos genéricosRecapitulação - Coleção genérica13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão Abstract FactoryPadrão ObserverPadrão Strategy2Tipos e Structs em Profundidade
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosTags de StructStructs AnônimasStructs AninhadasValores Zero e PadrõesRecapitulação - Livro de Contatos5Composição em vez de herança
Por que Go não tem herançaNoções básicas de incorporação de structsPromoção de métodosIncorporação de várias structsIncorporação vs agregaçãoOcultação de métodos incorporadosRecapitulação - Hierarquia de funcionários8Tratamento de Erros e OOP
A interface errorTipos de Erro PersonalizadosEncapsulamento de Erros (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - Analisador de Arquivos3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs. ReferênciaA Função new()Coleta de Lixo em GoRecapitulação - Construtor de Lista Ligada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfacesColeções PolimórficasInjeção de DependênciasRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e comunicaçãoCanais com e sem bufferInstrução selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de structs thread-safeRevisão - Worker PoolPratique por conta própria: Compilador de Go online