思路:双指针,搞定。
注意:需要判断几种特殊情况,主要考察细节。详见代码。
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null) return null;
//三个指针,因为涉及删除操作
ListNode pointer0=head,pointer1=head,pointer2=head;
int index=n;
//pointer2先行n步
while(index-->0&&pointer2!=null) pointer2=pointer2.next;
//如果链表长度都没有n,直接返回null,但是根据题意应该不会出现这种情况。
if(index>=0) return null;
if(pointer2==null){
//链表长度恰好为n,需要删除的是头结点,特殊处理
pointer1=pointer0.next;
pointer0.next=null;
return pointer1;
}
else{
//pointer1需要移动到pointer0的下一个,pointer0才能构成pointer1的父节点关系
pointer1=pointer1.next;
pointer2=pointer2.next;
}
while(pointer2!=null){
//三个指针同时移动,直到末尾
pointer0=pointer0.next;
pointer1=pointer1.next;
pointer2=pointer2.next;
}
//删除pointer1节点
pointer0.next=pointer1.next;
return head;
}