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