Estoy tratando de resolver este kata Encuentra el último elemento K-th de una lista enlazada individualmente :
Escriba una función que, dado el encabezado de una lista enlazada individualmente y un índice (basado en 0) contado desde el final de la lista, devuelva el elemento correspondiente a ese índice.
La función debe devolver un valor falso para los valores de entrada no válidos, como un índice fuera de rango.
Entonces, para la lista
66 -> 42 -> 13 -> 666, getKthLastElement() con el índice 2 debería devolver el Nodo (objeto predefinido para los nodos de la lista) correspondiente a 42.
No entiendo por qué aparece undefined en lugar de un número en mi return . Probé este código en un codepen, y todo funcionó bien, y el resultado es un número, pero en CodeWars no está definido.
function getKthLastElement(head, k) { let arr = []; while(head){ arr.push(head.data); head = head.next } if(k == 0) k = 1 let result = arr.splice(-k, 1) return +result }Cuando lee el desafío del código, ve que solicita devolver el k -ésimo elemento , la instancia del Node , no el valor .
Por lo tanto, no debe recopilar head.data , sino head . Y no devolver +result , sino result[0] .
Otro problema es que trata a k como 1 cuando tiene valor 0, pero esto no es lo que dice en la descripción. Un valor de 0 tiene un significado diferente que un valor de 1. En su lugar, siempre debe aumentar k con 1.
Luego está el requisito de devolver un valor falso cuando el valor de k está fuera de rango. No proporcionaste código para ese caso.
Así que aquí está el código corregido:
function getKthLastElement(head, k) { let arr = []; while(head){ arr.push(head); // Collect the node, not the value head = head.next; } if (k < 0 || k >= arr.length) return; // Out of range let result = arr.splice(-(k+1), 1); // Always add 1 to k return result[0]; // Return the node. }Esto funciona, pero no es eficiente en memoria. Al convertir toda la lista en una matriz, asignó memoria auxiliar O (n). Debería intentar hacerlo sin tal matriz.
Aquí hay un spoiler que espero que no necesites:
function getKthLastElement(head, k) { let lead = head; let lag = head; if (k < 0) return; // k is out of range for (let i = 0; i <= k; i++) { if (!lead) return; // k is out of range lead = lead.next; } while(lead) { lead = lead.next; lag = lag.next; } return lag; }