思路:快慢指针,核心思想就是采用两个间隔为n的指针,同时向前移动。当快指针的下一个节点为最后一个节点时,要删除的节点就是慢指针的下一个节点。这里要进行特殊处理p1快指针,防止空指针异常。
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null || head.next==null) {
return null;
}
ListNode p1 = head;
ListNode p2 = head;
for (int i = 0; i < n; i++) {
p1 = p1.next;
}
if(p1 == null){
return head.next;
}
while(p1.next!=null){
p1=p1.next;
p2=p2.next;
}
p2.next = p2.next.next;
return head;
}