var removeNthFromEnd = function(head, n) {
const sentinel = new ListNode();
sentinel.next = head;
const fast = moveFast(sentinel, n);
const slow = moveSlow(sentinel, fast);
slow.next = slow.next.next || null;
return sentinel.next;
};
const moveFast = (fast, n) => {
for (let i = 1; i <= (n + 1); i++) {
fast = fast.next;
}
return fast;
}
const moveSlow = (slow, fast) => {
while (fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
var removeNthFromEnd = function(head, n) {
const length = getNthFromEnd(head, n);
const isHead = length < 0;
if (isHead) return head.next;
const curr = moveNode(head, length);
curr.next = curr.next.next;
return head
};
const getNthFromEnd = (curr, n, length = 0) => {
while (curr) {
curr = curr.next;
length++;
}
return (length - n) - 1;
}
const moveNode = (curr, length) => {
while (length) {
curr = curr.next;
length--;
}
return curr;
}