题意
给定一个链表和数字n,要求删除从后往前数的第n个数。并且1 pass。
思路
用两个指针first和second,先让second往后跑n个,然后first和second一起往后挪动,直到second->next是NULL的时候,first->next就是我们要删除的节点。
感觉是个非常巧妙的思路,思想就是:我们要删除的节点和最后一个节点的距离差是n。
另外,一定要注意两个边界情况:
1. 链表为空
2. second往后跑n个过后,如果second为空,那么我们要删除的就是第一个节点。
代码
/**
* 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) return NULL;
ListNode *first = head, *second = head;
for (int i = 0; i < n; i++) second = second->next;
if (!second) {
//the Node to delete is the head;
ListNode *tmp = head;
head = head->next;
delete(tmp);
return head;
} else {
while (second->next) {
first = first->next;
second = second->next;
}
ListNode *tmp = first->next;
first->next = first->next->next;
delete(tmp);
}
return head;
}
};