【LeetCode19】刪除鏈表的倒數第N個節點

思路:雙指針,搞定。

注意:需要判斷幾種特殊情況,主要考察細節。詳見代碼。

    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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章