Gli elenchi collegati in modo circolare sono spesso implementati utilizzando matrici che li rendono molto veloci e, per loro natura, non richiedono il ridimensionamento dinamico. Hai solo bisogno di un rapido controllo degli indici di lettura e di scrittura per vedere se cadono dalla fine e, in tal caso, resettarlo a zero (o uno, qualunque sia).
Tuttavia, vengono generalmente utilizzati per cose come i buffer di input, dove i dati non hanno un valore reale una volta letti. Gli elenchi dei contatti hanno un valore duraturo e nuovi contatti sovrascriveranno i contatti più vecchi una volta che la lista si riempie, il che potrebbe andar bene a meno che non sovrascrivi tua nonna che ti lascia un mucchio di soldi nel suo testamento.
Non penso che un elenco collegato sia il modo più efficiente per ottenere un buffer circolare (la domanda originale).
Lo scopo di un buffer circolare è la velocità e un array semplicemente non può essere battuto per la velocità nel contesto di un buffer circolare. Anche se mantieni un puntatore al tuo ultimo elemento di elenco collegato, una matrice sarà comunque più efficiente. Le liste hanno capacità di ridimensionamento dinamico (overhead) non necessarie per i buffer circolari. Detto questo, penso che un buffer circolare non sia probabilmente la struttura giusta per l'applicazione (elenco di contatti) che menzioni.
Questo è solo un uomo perfetto, grazie! Per uno stile migliore, si potrebbe usare il '??' operatore: ritorno corrente.Prossimo ?? current.List.First; – Julien
@ Le complessità del linguaggio julien non aiutano necessariamente la leggibilità. –
Una cosa che è importante notare qui è che 'current.List' può essere potenzialmente nullo se il nodo stesso non è collegato. Vedere https://msdn.microsoft.com/en-us/library/h339c45b(v=vs.110).aspx –