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:
sz.1 <= sz <= 300 <= Node.val <= 1001 <= 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 *forwoard = head, *backwoard = head;
- int i = 0;
- while (forwoard) {
- forwoard = forwoard->next;
- if (i++ > n) {backwoard = backwoard->next;}
- }
- if (i < n) {return head;}
- else if (i == n) {return head->next;}
- else {
- backwoard->next = backwoard->next
- ? backwoard->next->next : nullptr;
- }
- return head;
- }
- };
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode() {}
- * ListNode(int val) { this.val = val; }
- * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
- * }
- */
- class Solution {
- public ListNode removeNthFromEnd(ListNode head, int n) {
- ListNode forwoard = head, backwoard = head;
- int i = 0;
- while (forwoard != null) {
- if (i++ > n) {backwoard = backwoard.next;}
- forwoard = forwoard.next;
- }
- if (i < n) {return head;}
- else if (i == n) {return head.next;}
- else {
- backwoard.next = backwoard.next != null
- ? backwoard.next.next : null;
- }
- return head;
- }
- }