题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例
输入:head = [1,2,3,4,5], n = 2 解释: |
输入:head = [1], n = 1 输出:[] |
输入:head = [1,2], n = 1 输出:[1] |
思路
我们通过添加虚拟头节点和双指针的思路来解决这道题。
首先,为什么要添加虚拟头节点呢?例如,如果我们要删除的是头节点,这时候的操作会与其余节点不同。然而,在头节点之前加一个虚拟节点,可以让原来的头节点变成普通节点,省去了我们多余的操作。
其次,我们该如何在这道题中运用双指针呢?
(1)我们先定义两个指针fastPointer和slowPointer,初始值都是虚拟节点。
(2)fastPointer首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slowPointer才能指向删除节点的上一个节点(方便做删除操作)。
(3)fastPointer和slowPointer同时移动,直到fastPointer指向null节点,删除slowPointer指向的下一个节点。
代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode slowPointer = dummy;
ListNode fastPointer = dummy;
for(int i = 0; i <= n; i++){
fastPointer = fastPointer.next;
}
while(fastPointer != null){
fastPointer = fastPointer.next;
slowPointer = slowPointer.next;
}
slowPointer.next = slowPointer.next.next;
return dummy.next;
}
}
这里同样,由于虚拟节点是我们自己添加上去的,原题并不需要,因此最后从虚拟节点的下一个节点开始返回。