Je suis en train de faire un Problème d'Interview Cracking the Coding (2.4) et je suis supposé partitionner une liste chaînée autour d'une valeur x, de sorte que tous les nœuds inférieurs à x viennent avant tous les nœuds supérieurs ou égaux à x. Cependant, je suis vraiment confus quant aux raisons pour lesquelles une variable temporaire "next" est nécessaire et pourquoi node.next est annulé en dessous. Pourquoi ne puis-je pas simplement faire node = node.next à la fin de la boucle while?Pourquoi ne puis-je pas simplement faire node = node.next pour parcourir la liste chaînée?
Je crée simplement deux listes liées, avant et après, et je les fusionne une fois que les valeurs correctes sont entrées dans chaque liste.
public static Node partition(Node node, int x) {
Node beforeStart = null;
Node beforeEnd = null;
Node afterStart = null;
Node afterEnd = null;
/* Partition list */
while (node != null) {
Node next = node.next;
node.next = null;
if (node.data < x) {
if (beforeStart == null) {
beforeStart = node;
beforeEnd = beforeStart;
} else {
beforeEnd.next = node;
beforeEnd = beforeEnd.next;
}
} else {
if (afterStart == null) {
afterStart = node;
afterEnd = afterStart;
} else {
afterEnd.next = node;
afterEnd = afterEnd.next;
}
}
node = next;
}
/* Merge before list and after list */
if (beforeStart == null) {
return afterStart;
}
beforeEnd.next = afterStart;
return beforeStart;
}
Si tout ce que vous faisiez était d'itérer dans la liste, node = node.next serait bien. Cependant, vous n'êtes pas seulement en train de répéter. – user2357112