思路:雙指針,搞定。
注意:需要判斷幾種特殊情況,主要考察細節。詳見代碼。
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;
}