思路:
双指针的经典应用,如果要删除倒数第n个结点:
(1)让fast先移动n步;
(2)让fast和slow同时移动,直到fast指向链表末尾;
(3)删掉slow所指向的结点。
图解:
- 初始,创建一个头结点L。使用头结点后,对第一个结点的操作就不用做特殊处理了。
- fast首先走n + 1步 ,为什么是n+1呢,因为我们添加了一个头结点,只有这样同时移动的时候slow才能指向删除节点的前驱节点(方便做删除操作)
- fast和slow同时移动,直到fast指向末尾(指向null)
- 删除slow指向的下一个节点,打卡收工!
代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
//设置头结点
ListNode L = new ListNode(-1,head);
ListNode fast = L;
ListNode slow = L;
//我们添加了一个虚拟头结点,所以fast要走n+1步
while(n >= 0){
fast = fast.next;
n--;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return L.next;
}