解题思路:
1.快慢指针法,新建一个新节点,代表头结点,头结点的next指向head(第一个节点),这样就不用考虑要删除的节点是否为头结点了
2.先让快指针移动n+1个位置,然后慢指针开始移动。快慢指针的初始位置都指向head(第一个节点)
3.当快指针到末尾时,慢指针指向的正好是要删除节点的前一个,此时直接让慢指针指向的节点的next指向其next.next即可
4.返回新节点.next即可
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//快慢指针:第一个指针移动到n+1时,第二个指针开始移动
//当快指针遍历到结尾时,慢指针正好遍历到倒数第n个节点
ListNode node=new ListNode(0);//新节点(头结点)
node.next=head;
ListNode fast=node;
ListNode slow= node;
for(int i=0;i<=n;++i){
fast=fast.next;
}
while(fast!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return node.next;
}
}