Given a linked list, remove the nth node from the end of list and return its head.
For 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.
Try to do this in one pass.
Two ideas:
1. scan the list from head to end, record the length of it, Then, the nth node from the end of list is the length - n from the head, then, delete it.
2. use two pointers, one scans firstly to N, then, the second pointer goes with the first one, the span between them will be N, Then, when the first pointer go to the end. The second one will point to Nth node.
/** * 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) { if(head == nullptr) return head; ListNode *cur = head, *end = head; ListNode *temp = new ListNode(-1); //trick1 temp -> next = head; head = temp; //trick2 int m = 0; while(end->next != NULL){ m++; end = end -> next; if(m >= n){ cur = cur -> next; temp = temp->next; } } temp -> next = cur -> next; delete cur; return head -> next; } };