题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
思路
应该使用双指针,首先创建一个虚拟头节点,然后再设置两个指针都指向这个虚拟头节点。移动fastnode,直到它找到第n个元素的后一个结点,此时同时移动fastnode和slownode,当dastnode指向末尾。假如让快指针移动n步的话,到最后slow指向的是要删除元素的前一个,所以为了方便,我们让fastnode移动n+1
代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode(0);//设置虚拟头
dummyNode.next = head;
ListNode slownode=dummyNode;
ListNode fastnode=dummyNode;//让两个指针都指向虚拟头
for(int i=0;i<n+1;i++){
fastnode=fastnode.next;//移动快指针
}
while(fastnode!=null){
fastnode=fastnode.next;//同时移动快指针和慢指针
slownode=slownode.next;
}
slownode.next=slownode.next.next; //此时 slowIndex 的位置就是待删除元素的前一个位置。
return dummyNode.next;
}
}