---
# System prepended metadata

title: 0019. Remove Nth Node From End of List
tags: [Leetcode, Linked List, Medium]

---

# 0019. Remove Nth Node From End of List
Link: https://leetcode.com/problems/remove-nth-node-from-end-of-list/
###### tags: `Leetcode` `Medium` `Linked List`
## 思路
### 思路一
首先遍历一次，得到整个linked list的长度，然后再遍历一次找到要删的node的前面那一个，将它的next赋值成它的next的next
为了避免a list with only one node, or removing the head of the list，在开头加了一个dummy node在head前面，因此return的时候只要return dummy.next就可以
### 思路二
Maintain two pointers and update one with a delay of n steps.
## Code in Java
### 思路二
```java=
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int num = 0;
        ListNode faster = head;
        ListNode slower = head;
        ListNode dummyNode = new ListNode(0, head);
        ListNode prev = dummyNode;
        while(faster!=null){
            if(num >= n){
                prev = slower;
                slower = slower.next;
            }
            faster = faster.next;
            num++;
        }
        prev.next = slower.next;
        return dummyNode.next;
    }
}
```
## Code in C++
### 思路一
```c=
/**
 * 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;
        ListNode* first = head;
        int length = 0;
        while(first != nullptr){
            length++;
            first = first->next;
        }
        length-=n;
        first = dummy;
        for(int i = 0;i < length;i++){
            first = first->next;
        }
        first->next = first->next->next;
        return dummy->next;
    }
};
```
### 思路二
```c=
/**
 * 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;
        ListNode* first = dummy;
        ListNode* second = dummy;
        for(int i = 0; i <= n; i++){
            first = first->next;
        }
        while(first != nullptr){
            first = first->next;
            second = second->next;
        }
        second->next = second->next->next;
        return dummy->next;
    }
};
```
## Result
### 思路一
Runtime: 4 ms, faster than **80.41%** of C++ online submissions for Remove Nth Node From End of List.
Memory Usage: 10.7 MB, less than **20.00%** of C++ online submissions for Remove Nth Node From End of List.
### 思路二
Runtime: 4 ms, faster than **80.41%** of C++ online submissions for Remove Nth Node From End of List.
Memory Usage: 10.5 MB, less than **94.40%** of C++ online submissions for Remove Nth Node From End of List.
