Soy nuevo en la codificación y el aprendizaje de problemas de listas enlazadas. Encontré una solución pero realmente no entiendo lo que hacen. ¿Qué significa (!node.next)? ¿Es lo mismo que node.next != null?
Además, no entiendo el retorno de esta línea (node.value > mayorValueInRest ? node.value : mayorValueInRest);
¿Significa que si node.value es mayor que mayorValueInRest, entonces node.value = mayorValueInRest?
aquí está la solución
function findMax(node) { if (!node.next) { return node.value; } else { const biggestValueInRest = findMax(node.next); return (node.value > biggestValueInRest ? node.value : biggestValueInRest); } }¿Qué significa (!node.next)? ¿Es lo mismo que node.next != null?
El ! es el operador de negación, niega el valor colocado delante de él.
por ejemplo !node.next es lo mismo que node.next == false .
En este caso, !node.next devolverá true si node.next es un valor falso como false , null o undefined .
En la declaración if de su código, devolverá el valor del nodo actual si no hay un siguiente nodo vinculado a ese nodo ya que, en las listas vinculadas, los nodos contienen un valor y un enlace al siguiente nodo.
Además, no entiendo el retorno de esta línea (node.value > mayorValueInRest ? node.value : mayorValueInRest);
¿Significa que si node.value es mayor que mayorValueInRest, entonces node.value = mayorValueInRest?
Ese es un operador ternario, es como un if abreviado que devuelve un valor.
return (node.value > biggestValueInRest ? node.value : biggestValueInRest);
sería lo mismo que:
if (node.value > biggestValueInRest) return node.value; else return biggestValueInRest;La sintaxis del operador ternario es básicamente:
"condition" ? "value to return if true" : "value to return if false"
Y para responder completamente a su pregunta.
Encontré una solución pero realmente no entiendo lo que hacen.
La solución proporcionada es recursiva , se llamará a sí mismo para cada nodo en las listas enlazadas hasta que llegue al final (el que es node.next está vacío), y una vez hecho esto, devolverá el mayor valor de cada comparación. desde allí.
Las funciones recursivas no siempre son una buena práctica, ya que su complejidad de tiempo puede aumentar dependiendo de cómo las implementó el desarrollador.
En este caso, sería O(n) , lo que significa que es lineal, lo que no está nada mal para una función recursiva.
Esto significa que el tiempo que tardará la función en finalizar se verá afectado en proporción al número de elementos que n la lista enlazada.
Entonces, si toma 1 por nodo, entonces 100 nodos serían 100 para que la función finalice.
Hubiera sido más simple en python, pero lo que puedes hacer es crear una función que se vea así, se explicará más adelante
asumiendo que la lista consiste solo en valores numéricos
Function(ListItems) { Let biggest_val = 0; For (let i = 0; i < ListItems.length; i++) { If (LisItems[i] > biggest_val) { biggest_val = ListItems[i] } } }Primero estamos inicializando una variable para que contenga el valor más grande de la lista para nosotros, y luego creando un ciclo for para recorrer la lista y verificar si el valor actual es mayor que nuestro valor más grande actual, si es así, actualice el valor de nuestro valor más grande .
el nodo.valor> mayorValueInRest? nodo.valor: mayorValueInRest se llama [operador de turno][1] es una declaración si abreviada, pero dado que recién está comenzando, es mejor seguir con la tradicional
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator