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


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

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

pre->next = cur.next;

pre 可以預設為 head(頭結點),比較 pre.next 和待刪除的結點,當 pre.next==delNode時,就找到了待刪除結點的前一個結點,然后執行上述賦值操作

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

這里我刪除結點的思路是:

  • 如果刪除節點是第一個結點並且下一個結點不為空、或者是中間結點

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

  • 如果刪除的結點是第一個節點,並且鏈表只有這一個結點,則使head=null

  • 如果刪除的結點是尾結點,則遍歷鏈表找到前一個結點,將這個結點的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,指向自己構建的頭節點

從該結點開始遍歷

  • 如果刪除的結點是第一個結點,則使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;
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM