给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
允许反馈(两趟扫描)就是计数,不多赘述
一趟扫描:双指针法:先来个先驱指针pioneer pt1,从head起走上n步,再从头来个指针pt2和他一块走,走到pt1->next==NULL,这样两个指针中间查了n-1个节点,要删除的就是pt1->next节点,用pt1->next=pt1->next->next,但是但是但是!!!如果我pioneer走n步就tm走到NULL了怎么办,想想没毛病,n是链表长度的话,就是删除头节点,就没法用pt1->next判决循环条件了,并且删除的也是*pt2而不是*(pt2->next),我们就在循环开始加个判断pt1是不是NULL,如果NULL,return个head->next就完事了。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*pt1=head,*pt2=head;
for(int i=0;i<n;i++)pt1=pt1->next;
if(pt1==NULL) return pt2->next;
else{
while(pt1->next!=NULL){
pt1=pt1->next;
pt2=pt2->next;
}
pt2->next=pt2->next->next;
return head;
}
}
};