给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
思路分析:
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了,推荐使用虚拟头节点来解决,方便处理删除头节点的逻辑.具体代码实现如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//设置虚拟头节点,可以方便处理头节点
ListNode dummyHead = new ListNode(-1,head);
//定义快慢指针
ListNode fastIndex = dummyHead;
ListNode slowIndex = dummyHead;
//先让快指针移动n个单位
//方便等会处理删除节点
while(n>0){
fastIndex = fastIndex.next;
n--;
}
//一起移动,直到fastIndex.next==null
while(fastIndex.next!=null){
fastIndex = fastIndex.next;
slowIndex = slowIndex.next;
}
slowIndex.next = slowIndex.next.next;//删除节点
return dummyHead.next;//删除虚拟头节点
}
}