無頭節點的單鏈表如何刪除結點

無頭節點的單鏈表中如何刪除結點

在有頭結點的單鏈表中,刪除結點的方式是,經過找到刪除節點的前面一個結點,將前一個結點的next指向刪除結點的nextjava

pre->next = cur.next;

pre 能夠預設爲 head(頭結點),比較 pre.next 和待刪除的結點,當 pre.next==delNode時,就找到了待刪除結點的前一個結點,而後執行上述賦值操做指針

可是在沒有頭節點,只有頭指針的單鏈表中,假如待刪除的結點是第一個結點,只能從第一個結點開始遍歷,就沒法經過找到前一個結點進行賦值操做。code

這裏我刪除結點的思路是:class

  • 若是刪除節點是第一個結點而且下一個結點不爲空、或者是中間結點遍歷

    將下一個節點的內容賦值到當前刪除結點鏈表

  • 若是刪除的結點是第一個節點,而且鏈表只有這一個結點,則使head=nullnext

  • 若是刪除的結點是尾結點,則遍歷鏈表找到前一個結點,將這個結點的next賦值爲空數據

代碼實現(不借助其餘結點)

public void delEmpById(int id) {
        if (head == null) {
            System.out.println("鏈表爲空");
            return;
        }
        Emp cur = head;
        while (cur != null && cur.id != id) {
            cur = cur.next;
        }
        if (cur == null) {
            //沒有找到待刪除結點
            System.out.println("未找到要刪除的結點");
            return;
        } else {
            //找到了待刪除的結點
            if (cur == head & head.next == null) {//要刪除的結點是第一個結點,而且鏈表中只有一個結點
                head = null;
            } else if (cur.next == null) {//該結點是尾結點
                Emp temp = head;
                while(temp.next!=cur){
                    temp = temp.next;
                }
                temp.next=null;
            } else {//該結點是中間結點或者頭結點
                //將下一個結點的數據拷貝到當前結點,而後將下一個結點賦爲null
                cur.id = cur.next.id;
                cur.name = cur.next.name;
                cur.next = cur.next.next;
            }
        }
    }

除此以外,也能夠構建一個頭結點,該頭節點指向head,而後建立一個輔助的遍歷結點cur,指向本身構建的頭節點while

從該結點開始遍歷co

  • 若是刪除的結點是第一個結點,則使head = head.next
  • 若是刪除的結點是中間結點或者尾結點,則使cur.next = cur.next.next
  • 若是cur.next==null,說明鏈表中沒有該結點

代碼實現(藉助額外構建的頭結點)

public void delEmpById(int id) {
        if (head == null) {
            System.out.println("鏈表爲空");
            return;
        }
        //建立一個新的頭節點,next指向鏈表的第一個結點
        Emp newHead = new Emp(0, "");
        newHead.next = head;
        //從這個新結點開始遍歷
        Emp cur = newHead;
        while (cur.next != null && cur.next.id != id) {
            cur = cur.next;
        }
        if(cur.next==null){
            System.out.println("未找到該結點");
            return;
        }else if (cur.next == head) {
            head = head.next;
        } else {
            //刪除的是中間結點或者尾結點
            cur.next = cur.next.next;
        }
    }
相關文章
相關標籤/搜索