题名:Remove Nth Node From End of List
难度:Medium
题目描述:
题目分析:
如果不要求遍历次数是很简单的,可以遍历一次得到链表长度L,然后再一次遍历删除第L-n+1个节点。
现在我们考虑如何一次遍历删除倒数第n个节点。我们可以使用两个指针:begin和end,两个指针之间隔开n的距离。(这样如果end是尾节点,那么begin指向的就是目标节点的前一个节点,便于之后的删除操作)之后我们可以同时移动两个节点,直到end指针到达链表尾部。期间要注意end指针是否提前到达尾部,如果要删除的节点是第一个节点,begin指针不可能指向目标节点的前一个节点。处理链表问题要一直注意是否越界指向了NULL,对NULL进行了操作。
代码如下:
/**
* 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) {
// 如果只有一个元素,直接返回NULL
if(head->next == NULL){
return NULL;
}
ListNode* begin = head;
ListNode* end = head;
//移动end指针,与begin拉开n个距离,使begin定位在要删除元素的前一个元素
int i; //注意是否提前到达尾部,即在移动完n步之前到达尾部
for(i = 0; i < n && end->next != NULL; i++){
end = end->next;
}
if(i != n){ //如果提前到达尾部,则要删除元素为第一个元素
*head = *(head->next);
}
else{
//同时移动begin和end,直到end到达尾部
while(end->next != NULL){
begin = begin->next;
end = end->next;
}
//删除指定节点
begin->next = begin->next->next;
}
return head;
}
};