Ho letto un libro su "Strutture dati e algoritmi" in cui esiste un incarico che mi chiede di implementare una lista circolare circolare. Questo è un esercizio di apprendimento e il mio codice potrebbe non essere di altissimo livello.Come implementare l'elenco circolare circolare in java?
L'idea principale dietro la mia implementazione di un elenco circolare circolare è di avere un puntatore che punta all'ultimo elemento e ogni volta che aggiungo un nuovo elemento, il campo "prossimo" dell'ultimo elemento verrà aggiornato per puntare al nuovo elemento aggiunto.
Il metodo di inserimento funziona correttamente, posso aggiungere elementi senza problemi, ma per qualche motivo non riesco a eliminare elementi dall'elenco.
Qui è il codice per 'Link' o 'nodo':
public class Link {
public long data;
public Link next;
public Link(long val) {
data = val;
next = null;
}
public void displayLink() {
System.out.print(data + " ");
}
} // end class
Questo è il codice per la classe che svolge il lavoro, e il bug è ovviamente da qualche parte qui:
public class CircularList {
Link first;
Link last;
public CircularList() {
first = null;
last = null;
}
public Link find(long key) {
Link current = first;
while(current.data != key) {
current = current.next;
}
return current;
} // end find
public Link delete() {
if(first.next == null)
last = null;
Link temp = first;
first = first.next;
return temp;
} // end delete
public boolean isEmpty() { return (first == null); }
public void insert(long val) {
Link newLink = new Link(val);
if(isEmpty())
last = newLink;
newLink.next = first;
first = newLink;
last.next = first;
} // end insert
public void displayAmount(int n) {
Link current = first;
while(n>0) {
current.displayLink();
current = current.next;
n--;
}
System.out.println("");
} // end displayAmount
} // end class
e il codice applicazione principale:
public class App {
public static void main(String[] args) {
CircularList cl = new CircularList();
cl.insert(10);
cl.insert(20);
cl.insert(30);
cl.insert(40);
cl.displayAmount(6);
cl.delete();
cl.displayAmount(6);
}
} // end class
la quantità di visualizzazione sembra un po 'sciocco, ho solo cercato di evitare il ciclo infinito e m Ade qualcosa di semplice che funziona.
E qual è la tua domanda? –
Il nodo dell'elenco collegato manca un riferimento al nodo precedente, rendendo impossibile la rimozione. Si desidera che l'ultimo elemento si riferisca al primo e al primo all'ultimo, il che significa che entrambi hanno bisogno di un successivo e di un precedente. Con questi, puoi prendere qualsiasi elemento, ottenere il precedente e il successivo sull'elemento corrente e collegarlo al precedente, eliminando efficacemente l'elemento da eliminare. –
@G_V il metodo 'delete()' così com'è sempre (prova a) cancella il primo elemento, che è OK perché il suo predecessore è 'last'. Avresti bisogno di un doppio collegamento se volessi eliminare elementi arbitrari, ma se elimini solo "prima", non ne hai bisogno. –