Dichiarazione di problema: Dato un elenco circolare collegato, implementare un algoritmo che restituisce il nodo all'inizio del ciclo.Cracking the Coding Interview, 6th edition, 2.8
La chiave di risposta fornisce una soluzione più complicata di quella che propongo. Cosa c'è di sbagliato con la mia ?:
public static Node loopDetection(Node n1) {
ArrayList<Node> nodeStorage = new ArrayList<Node>();
while (n1.next != null) {
nodeStorage.add(n1);
if (nodeStorage.contains(n1.next)) {
return n1;
}
else {
n1 = n1.next;
}
}
return null;
}
Sono confuso. In una lista concatenata circolare, manterrai un riferimento alla "testa" della lista, e la testa è il "primo" nodo nel ciclo, quindi è all'inizio del ciclo, da cui "testa di ritorno". (O (1)). O se il tuo unico riferimento è alla "coda" della lista, la testa è a "tail.next", ancora una semplice dichiarazione di ritorno. – Andreas
@Andreas: considera una lista A-> B-> C-> D-> E-> C-> D-> E-> ... L'inizio del ciclo è in C, non in A. E una lista collegata con un ciclo non ha una coda. Immagina di guidare su una strada a senso unico su una rotatoria senza uscite. – gnasher729
@ gnasher729 C'è una differenza tra un [* elenco circolare * collegato] (https://en.wikipedia.org/wiki/Linked_list#Circular_Linked_list), dove l'ultimo nodo punta al primo nodo e un * corrotto * elenco collegato non circolare (aka aperto o lineare) con un * ciclo *. Ora posso vedere che la domanda non è in realtà su una lista concatenata * circolare *, ma su una lista collegata * corrotta * lineare, quindi la mia confusione originale. La "dichiarazione del problema" è mal formulata. – Andreas