# 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 = [1], n = 1

**Output:** []

**Example 3:**

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

**Output:** [1]

**Constraints:**

- The number of nodes in the list is
`sz`

. `1 <= sz <= 30`

`0 <= Node.val <= 100`

`1 <= n <= 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):`

def removeNthFromEnd(self, head, n):

inter,inter.next=ListNode(0),head

head,cnt=inter,0

ptr1,ptr2=head,head

while(cnt!=n):

cnt+=1

ptr1=ptr1.next

while(ptr1.next):

ptr1=ptr1.next

ptr2=ptr2.next

ptr2.next=ptr2.next.next

return (head.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):`

def removeNthFromEnd(self, head, n):

ptr1=head

cnt=0

while(ptr1):

cnt+=1

ptr1=ptr1.next

if cnt-n==0:

return head.next

val=0

ptr2=head

while(val!=cnt-n-1):

val+=1

ptr2=ptr2.next

ptr2.next=ptr2.next.next

return head

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 removeNthFromEnd(self, head, n):

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)

inter.next=head

head=inter

rec(head,n)

return inter.next

Time:O(n)

Spcae:O(n)