Problem:
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.
Analysis:
本题的解法在于使用两个指针。前方的指针比后面的指针要前进n个元素。同时移动两个指针,知道前面的指针为空。然后删掉后面指针指向的元素。
时间复杂性:O(1) 空间复杂性:O(n)
类型:数据结构,操作题
衍生题:在指定位置插入一个元素(在中间插入元素可以使用不同速度指针的技巧)。
Solutions:
C++:
ListNode *removeNthFromEnd(ListNode *head, int n)
{
if(head==NULL) return head;
if(head->next==NULL){
head=NULL;
return head;
}
ListNode *pFront=head, *pBack=head;
for(int i=0; i<n; ++i){
pFront=pFront->next;
}
if(pFront==NULL) head=head->next;
else{
while(pFront->next!=NULL){
pFront=pFront->next;
pBack=pBack->next;
}
pBack->next=pBack->next->next;
}
return head;
}