Remove Nth Node From End of List

Given the head of a linked list, remove the nth node from the end of the list and return its head.

Example 1:

Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]

Example 2:

Input: head = , n = 1
Output: []

Example 3:

Input: head = [1,2], n = 1
Output: 

Constraints:

• The number of nodes in the list is sz.

Approach 1:

2 pointer approach

We keep a ptr1 which traverses the linked list and on reaching the nth element we stop the ptr1 from moving. And this instant we start another pointer ptr2, now both of the pointer move together . When ptr1 reaches the last node the pointer node will be at at previous node of the nth node from end, so now we can easily delete that node .

Note that an additional node is used to point to the head so that could deal with all edge cases including only 1 node in the linked list.

class Solution(object):
while(cnt!=n):
cnt+=1
ptr1=ptr1.next
while(ptr1.next):
ptr1=ptr1.next
ptr2=ptr2.next
ptr2.next=ptr2.next.next

Time: O(n)

Space :O(1)

Approach 2 :

2 pass solution

Here we traverse the linked list once and then count total number of nodes in the linked list and then, find the position of the nth node from end , with respect to the beginning by, total nodes — (n-1).

class Solution(object):
cnt=0
while(ptr1):
cnt+=1
ptr1=ptr1.next
if cnt-n==0:
val=0
while(val!=cnt-n-1):
val+=1
ptr2=ptr2.next
ptr2.next=ptr2.next.next

Time: O(n)

Space :O(1)

Approach 3:

Recursive

On reaching the end of the linked list the index starting from end is returned to the previous caller
which helps in determining the nth node from the end.

class Solution(object):
def rec(curr,n):
if not curr:
return -1
ind=rec(curr.next,n)+1
if ind ==n:
curr.next=curr.next.next
return ind
inter=ListNode(0)