---
tags: leetcode
---
# [19. Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
---
# My Solution
## Solution 1
### The Key Idea for Solving This Coding Question
### C++ Code
```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) {
int len = 0;
ListNode *it = head;
while (it != nullptr) {
++len;
it = it->next;
}
int target = len - n;
ListNode *dummy = new ListNode(), *prev = dummy, *curr = head;
dummy->next = head;
for (int i = 0; i < target; ++i) {
prev = prev->next;
curr = curr->next;
}
prev->next = curr->next;
delete curr;
head = dummy->next;
delete dummy;
return head;
}
};
```
### Time Complexity
$O(n)$
$n$ is the number of nodes in the linked list referred by `head`.
### Space Complexity
$O(1)$
## Solution 2:
### The Key Idea for Solving This Coding Question
DFS. Recursion. Post order traversal.
Solve this coding question in one pass.
### C++ Code 1
```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 *dummy = new ListNode();
dummy->next = head;
dfs(dummy, head, n);
head = dummy->next;
delete dummy;
return head;
}
private:
void dfs(ListNode *prev, ListNode *head, int &n) {
if (head == nullptr) {
return;
}
dfs(head, head->next, n);
--n;
if (n == 0) {
prev->next = head->next;
delete head;
return;
}
}
};
```
### C++ Code 2
```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) {}
* };
*/
struct Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *dummy = new ListNode();
dummy->next = dfs(head, n);
head = dummy->next;
delete dummy;
return head;
}
private:
ListNode *dfs(ListNode *head, int &n) {
if (head == nullptr) {
return nullptr;
}
head->next = dfs(head->next, n);
--n;
if (n == 0) {
ListNode *x = head->next;
delete head;
return x;
}
return head;
}
};
```
### Time Complexity
$O(n)$
$n$ is the number of nodes in the linked list referred by `head`.
### Space Complexity
$O(n)$
## Solution 3:
### The Key Idea for Solving This Coding Question
Use two pointers and iteration to solve this coding question in one pass.
### C++ Code
```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 *dummy = new ListNode(), *it1 = dummy, *it2 = head;
dummy->next = head;
while (n > 0) {
it2 = it2->next;
--n;
}
while (it2 != nullptr) {
it1 = it1->next;
it2 = it2->next;
}
ListNode *x = it1->next;
it1->next = it1->next->next;
delete x;
head = dummy->next;
delete dummy;
return head;
}
};
```
### Time Complexity
$O(n)$
$n$ is the number of nodes in the linked list referred by `head`.
### Space Complexity
$O(1)$
# Miscellaneous
<!--
# Test Cases
```
[1,2,3,4,5]
2
```
```
[1]
1
```
```
[1,2]
1
```
```
[1,2]
2
```
```
[1,2,3,4,5]
1
```
```
[1,2,3,4,5]
5
```
-->