method: 2 pass
1 first pass count number of nodes
2 second pass remove node
Python:
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
p = q = dummy = ListNode(0)
dummy.next = head
counter = 0
while p:
counter += 1
p = p.next
k = counter - n
i = 1
while i < k:
q = q.next
i += 1
q.next = q.next.next
return dummy.next
JS:
// always forget new of ListNode()
var removeNthFromEnd = function(head, n) {
if (!head) return head
let dummy = new ListNode();
dummy.next = head;
let p = dummy;
let q = dummy;
// 1st pass
let count = 0;
while (p) {
count++;
p = p.next;
}
// 2nd pass
i = 1;
k = count - n;
while (i < k) {
i++;
q = q.next
}
q.next = q.next.next
return dummy.next
};