问题
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.
代码
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
if (!head) {
return head;
}
ListNode *temp = head;
ListNode *probe = NULL;
ListNode *prev = temp;
while (temp) {
probe = temp;
int i =0;
while (i < n) {
if (!probe) {
break;
}
probe = probe->next;
i++;
}
if (!probe && i == n) {
/* found */
if (head == temp) {
return head->next;
}
prev->next = temp->next;
return head;
}
prev = temp;
temp = temp->next;
}
return head;
}
};
分析
这个主要考链表,各种可能出现的情况最好考虑清楚,虽然题目讲明n肯定是valid number, 但还是尽量做好空值检查,防止错误输入。
设置一个prev, 一个 遍历的 temp, 然后一个probe ,probe每次向后探 N 次,如果碰到NULL,或者i == n 则返回,如果 i正好等于N,且probe为空,则表明temp就是要找到的。 prev->next=temp->next 即可,其实理应free掉这个node。反正无所谓咯。
总结
链表。