# GeetCode Hub

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`

Follow up: Could you do this in one pass?

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode** t1 = &head, *t2 = head; for(int i = 1; i < n; ++i) { t2 = t2->next; } while(t2->next != NULL) { t1 = &((*t1)->next); t2 = t2->next; } *t1 = (*t1)->next; return head; } };

The main concept to remember in this question is how we can use two pointers, i.e slow and fast pointers, to find the node that needs to be deleted. Once that is found then it is an easy task to delete the node.

Time Complexity: O(n)

Space Complexity: O(1)