給定一個鏈表,刪除鏈表的倒數第 n 個節點(已知該結點存在),而且返回鏈表的頭結點。

思路:

找到倒數第n個結點的前一個結點,讓該結點的後繼爲倒數第n個結點的後繼 ide

子問題:找到倒數第n個結點的前驅
        1.有兩個引用,第一個引用指向首節點,而後走n步
        2.第二個結點指向首節點,此時兩結點之間隔了n-1個結點,保持這樣的距離,共同向後移動
        3.當第一個引用到達尾節點時,第二個引用離尾節點有n-1個結點,
        4.此時第二個結點爲倒數第n+1個結點,即倒數第n個結點的前驅
    特殊狀況:
        1.鏈表只有一個結點或者爲空鏈表,直接返回空便可;
        2.鏈表的長度恰好等於n,即刪除首節點,第一個引用從頭結點開始移動n步後,
        第一個引用移動到了尾節點的下一個,即此時第一個引用爲空,
        出現第一個在移動n步後爲空的狀況時,說明要刪除的是首節點,直接將首節點定爲首節點的下一個便可

參考代碼:

public static ListNode removeNthFromEnd(ListNode head, int n) {
        //若是鏈表自己爲空或者只有一個結點,直接返回空便可
        if(head==null||head.next==null){
            return null;
        }
        ListNode cur=head;
        ListNode pre=head;
        for(int i=0;i<n;i++){
            cur=cur.next;
        }
        if(cur==null){
            head=head.next;
            return head;
        }
        while(cur.next!=null){
            cur=cur.next;
            pre=pre.next;
        }

        pre.next=pre.next.next;
        return head;
    }
相關文章
相關標籤/搜索