19.删除链表的倒数第N个节点
这道题是链表问题中双指针的一个经典应用
如果要删除倒数第n个节点,那么我们让fast快指针移动n步,然后让fast和慢指针slow同时开始移动,当fast指针指向链表末尾的时候,删掉slow指针指向的节点即可。
思路是这样的,但是我们仍需要注意一些细节
- 1、使用虚拟头节点
- 2、定义fast和slow指针,初始值为虚拟头节点,如图所示
- 3、fast首先走n+1步
- 4、fast和slow同时移动,直到fast指向末尾
- 5、最后删除slow指针指向的结点
public ListNode removeNthFromEnd(ListNode head, int n) {
//虚拟头节点
ListNode dumyHead = new ListNode(0);
//令虚拟头节点的指针指向链表的头节点
dumyHead.next = head;
//快指针
ListNode fast = dumyHead;
//慢指针
ListNode slow = dumyHead;
//快慢指针相差n个索引位置
for(int i=0;i<n;i++){
fast = fast.next;
}
//当快指针走到链表末尾的时候,慢指针指向的位置就是要删除结点的位置
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
//此时slow的位置就是要删除结点的位置
slow.next = slow.next.next;
return dumyHead.next;
}