Discription:
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.
Solution:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == NULL) return NULL;
ListNode *p1 = head, *pPre = NULL;
ListNode *p2 = head;
for (int i = 0; i < n - 1; i++) p2 = p2->next;
while (p2->next){
pPre = p1;
p1 = p1->next;
p2 = p2->next;
}
if (pPre == NULL){
head = p1->next;
delete p1;
}
else{
pPre->next = p1->next;
delete p1;
}
return head;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *prehead = new ListNode(-1), *cur1 = prehead, *cur2 = prehead;
prehead->next = head;
for (int i = 0; i < n; i++){
cur2 = cur2->next;
}
while (cur2->next){
cur2 = cur2->next;
cur1 = cur1->next;
}
ListNode *temp = cur1->next;
cur1->next = cur1->next->next;
delete temp;
return prehead->next;
}
GitHub-LeetCode: https://github.com/wenwu313/LeetCode