# Leetcode Remove-Nth-Node-From-End-of-List

#### 2022-07-13 09:31

> ##### Algorithms:
>
> #algorithm #two_pointers
>
> ##### Data structures:
>
> #DS #linked_list
>
> ##### Difficulty:
>
> #coding_problem #difficulty-medium
>
> ##### Additional tags:
>
> #leetcode #CS_list_need_understanding
>
> ##### Revisions:
>
> N/A

##### Related topics:

##### Links:

- [Link to problem](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
- [Explanation](https://leetcode.com/problems/remove-nth-node-from-end-of-list/discuss/1164542/JS-Python-Java-C%2B%2B-or-Easy-Two-Pointer-Solution-w-Explanation)

---

### Problem

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

#### Examples

**Example 1:**

![](https://assets.leetcode.com/uploads/2020/10/03/remove_ex1.jpg)

**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`

### Thoughts

> [!summary]
> This is a #two_pointers problem

#TODO: Understand the two-pointer method

Initially, I thought I use one pointer to remember how long the list is, and use another to traverse there, and remove.

#### Two pointers method

To finish this in one pass, i need to somehow make the two
pointers reach the end at the same time.

We can let fast go n step first, such that **when fast comes to the end**, slow gets to the Nth node from the last.

To find the 2nd from the last:

```

slow
|
v
1 -> 2 -> 3 -> 4 -> 5
|         ^
|----N----|
					fast

```

### Solution

Two pointers method

```cpp
/**
 * 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 *pre = new ListNode(0, head);
    ListNode *slow = pre;
    ListNode *fast = slow;

    while (n) {
      fast = fast->next;
      n--;
    }

    while (fast->next) {
      slow = slow->next;
      fast = fast->next;
    }

    fast = slow->next;
    slow->next = slow->next->next;
    delete fast;

    return pre->next;
  }
};
```

Initial iteration:

```cpp
/**
 * 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) {
    // Use one pointer to get length, another to traverse there
    int count = 1;
    ListNode *fast = head;

    while (1) {
      if (fast->next && fast->next->next) {
        fast = fast->next->next;
        count += 2;
      } else if (!fast->next) {
        break;
      } else {
        count += 1;
        break;
      }
    }

    count = count - n;
    ListNode *pre = new ListNode(0, head);
    ListNode *slow = pre;
    while (count) {
      slow = slow->next;
      count--;
    }

    fast = slow->next;
    slow->next = slow->next->next;
    delete fast;

    return pre->next;
  }
};
```
