Stai lavorando a un progetto per sviluppare un sistema di pianificazione dei treni per una rete ferroviaria molto trafficata.
Ti è stato chiesto di sviluppare un prototipo per le tratte dei treni del sistema di pianificazione. Ogni tratta è composta da una sequenza di stazioni ferroviarie in cui un determinato treno fa fermata.
Il tuo team ha deciso di usare una lista doppiamente concatenata per rappresentare ogni percorso ferroviario dell'orario. Ogni stazione lungo il percorso del treno sarà rappresentata da un nodo della lista concatenata.
Non devi preoccuparti degli orari di arrivo e di partenza alle stazioni. Ogni stazione sarà semplicemente rappresentata da un numero.
I percorsi possono essere estesi, aggiungendo stazioni all'inizio o alla fine di un percorso. Si possono anche accorciare rimuovendo stazioni dall'inizio o dalla fine di un percorso.
A volte una stazione viene chiusa, e in quel caso va rimossa dal percorso, anche se non si trova all'inizio o alla fine.
La dimensione di un percorso non si misura in base a quanto lontano viaggia il treno, ma in base a quante stazioni tocca.
La lista concatenata è una struttura dati fondamentale dell'informatica, spesso usata per implementare altre strutture dati. Come suggerisce il nome, è una lista di nodi collegati tra loro. È una lista di «nodi», in cui ogni nodo è collegato al suo vicino o ai suoi vicini. In una lista semplicemente concatenata ogni nodo è collegato solo al nodo che lo segue. In una lista doppiamente concatenata ogni nodo è collegato sia al nodo che viene prima sia a quello che viene dopo.
Se vuoi approfondire le liste concatenate, dai un'occhiata a questo articolo, che le spiega con dei bei disegni.
Scriverai un'implementazione di una lista doppiamente collegata.
Implementa un Node che contenga un valore e i puntatori al nodo successivo e a quello precedente.
Poi implementa una List che contenga i riferimenti al primo e all'ultimo nodo e offra funzioni per aggiungere e rimuovere elementi.
Il tuo Node dovrebbe avere i seguenti campi e metodi:
Value: il valore del nodo (useremo any).Next() *Node: puntatore al nodo successivo.Prev() *Node: puntatore al nodo precedente.Dovresti avere una funzione NewList() che crea e restituisce una List:
NewList(args ...any) *List: crea una nuova lista collegata preservando l'ordine dei valori.La tua List dovrebbe avere i seguenti metodi:
First() *Node: restituisce un puntatore al primo nodo (la testa).Last() *Node: restituisce un puntatore all'ultimo nodo (la coda).Push(v any): inserisce un valore in fondo alla lista.Pop() (any, error): rimuove un valore dal fondo della lista.Unshift(v any): inserisce un valore all'inizio della lista.Shift() (any, error): rimuove un valore dall'inizio della lista.Reverse(): inverte la lista collegata.Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.