# Remove Nth Node From End of List

[https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)

> Given a linked list, remove the nth node from the end of list and return its head.
>
> Example:
>
> Given linked list: 1->2->3->4->5, and n = 2.
>
> After removing the second node from the end, the linked list becomes 1->2->3->5.

## Thoughts

从后面数第n个，让一个指针先走n个（与第二个差n），然后两个再同时走到最后一个元素(不能到NULL), 此时第二个元素所在位置就是倒数第n-1个。

## Code

```
/*
 * @lc app=leetcode id=19 lang=cpp
 *
 * [19] Remove Nth Node From End of List
 *
 * https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
 *
 * algorithms
 * Medium (34.54%)
 * Likes:    2090
 * Dislikes: 158
 * Total Accepted:    441.2K
 * Total Submissions: 1.3M
 * Testcase Example:  '[1,2,3,4,5]\n2'
 *
 * Given a linked list, remove the n-th node from the end of list and return
 * its head.
 * 
 * Example:
 * 
 * 
 * Given linked list: 1->2->3->4->5, and n = 2.
 * 
 * After removing the second node from the end, the linked list becomes
 * 1->2->3->5.
 * 
 * 
 * Note:
 * 
 * Given n will always be valid.
 * 
 * Follow up:
 * 
 * Could you do this in one pass?
 * 
 */
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto first = head, sec = head;
        for (int i = 0; i < n; ++i) first = first->next;
        if (first == nullptr) return head->next;
        while (first->next != nullptr) {
            first = first->next;
            sec = sec->next;
        }
        sec->next = sec->next->next;
        return head;
    }
};


```

## Analysis

TC: O(n)

只需要扫一遍。
