思路:要删除链表的倒数第n个节点,只需要找到倒数第n+1个节点然后改变他的指针即可!
问题转换为:找到倒数第n+1个节点?
假设要删除倒数第2个节点,只需要找到倒数第3个节点,问题是如何定位到这个节点
可见一个指针是不够的!
再来一个fast指针指向null,fast指针比slow指针多走3步【即n+1步】
设置虚拟头节点的目的是:在删除头节点时避免判断!
代码如下
public ListNode removeNthFromEnd(ListNode head, int n) {
//定义虚拟头节点
ListNode pre=new ListNode();
ListNode slow=pre;
ListNode fast=pre;
pre.next=head;
//让快指针先走n+1步
for(int i=0;i<=n;i++){
fast=fast.next;
}
//然后快慢指针一起移动
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
//删除倒数第n个节点
slow.next=slow.next.next;
return pre.next;
}
}