在有頭結點的單鏈表中,刪除結點的方式是,經過找到刪除節點的前面一個結點,將前一個結點的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
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; } }