对于这种可能会删除头结点的题目:
1.先创建一个虚拟头结点dummy,再用头指针指向头结点
2.返回值为: dummy.next
3.这样不用考虑多种情况:删除的是不是头节点

java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
List<Integer> arr=new ArrayList<Integer>();
ListNode p=head;
while(p!=null){
arr.add(p.val);
p=p.next;
}
int flag=arr.size()-n;
ListNode dummy=new ListNode(-1); //虚拟头结点,这样可以不用考虑是否删除的是第一个结点
ListNode prev=dummy; //头指针指向头结点
prev.next=head;
for(int i=0;i<flag;i++){
prev=prev.next;
}
prev.next=prev.next.next;
return dummy.next;
}
}