In Java i puntatori sono gestiti in modo automatico, per cui dimentica l'operatore & (che viene usato solo per il "bitwise and") e l'operatore * (che è usato solo per le moltiplicazioni).
Il bello di Java è che non appena lo installi ottieni "gratuitamente" una ricca libreria (ti consiglio di guardarti la documentazione e di dare uno sguardo al numero di classi che sono già implementate ), che ti offre, fra le altre cose, anche delle implementazioni di liste.
In particolare è definita un'interfaccia
List che fornisce un "contratto" che le classi che implementano una lista devono rispettare (non ho mai usato C++, ma immagino sia la stessa cosa). Se guardi più nel dettaglio puoi vedere che fra le "All known implementing Classes" c'è un elenco di classi (già implementate) che implementano tale interfaccia, di cui
LinkedList,
ArrayList e
Vector sono le più usate. Per capire come funzionano ti basta leggerti la loro documentazione.
Di fatto nella maggior parte dei casi non hai bisogno di implementarti manualmente una lista, ma puoi tranquillamente usare una di queste classi che, essendo definite come "generics", possono essere usate per contenere qualsiasi tipo di dato. In realtà con i generics puoi usare solo i tipi di dato non primitivi (quindi ad esempio non puoi creare una lista di int), ma questa non è una limitazione poiché esistono le classi wrapper che ti permettono di usare i tipi primitivi come se fossero delle classi. Ad esempio per creare una lista (implementata come lista concatenata) di interi scriverai:
List<int> lista1= new LinkedList<int>(); // questa riga è sbagliata perché usa un tipo primitivo
List<Integer> lista2 = new LinkedList<Integer>(); // questa usa il wrapper ed è giusta