Recapitulação - Construtor de Lista Encadeada
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 24 de 107.
Desafio
FácilVamos construir uma lista encadeada do zero! Você criará uma estrutura de dados onde 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 structNodecom os camposValue(int) eNext(*Node). Crie uma structLinkedListque contém 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, construa uma lista encadeada anexando (appending) e prefixando (prepending) nós, e então imprima a estrutura final da lista.
As seguintes entradas serão fornecidas:
- Linha 1: Primeiro valor para anexar (append)
- Linha 2: Segundo valor para anexar (append)
- Linha 3: Valor para prefixar (prepend)
Seu método Print deve exibir 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 até o final da lista (onde Next é nil) antes de adicionar o novo nó. O método Prepend deve criar um novo nó, apontar seu Next para o head atual e, em seguida, atualizar o head para o novo nó. Lembre-se de que uma lista vazia tem um head nil, portanto, trate esse caso em seu 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 ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool