定義 cur 從表的第二個(gè)結(jié)點(diǎn)開始遍歷。
定義 prev 從表的 cur 的前驅(qū)位置開始遍歷。
現(xiàn)在要?jiǎng)h除的是,值是2的結(jié)點(diǎn)。
cur 此時(shí)指向了要?jiǎng)h除的結(jié)點(diǎn),進(jìn)行改指向刪除。
cur 指向下一個(gè),prev 指向 cur 的前驅(qū)。
比較此時(shí) cur 指向結(jié)點(diǎn)的值是不是要?jiǎng)h除結(jié)點(diǎn)的。
cur 往后走,prev 指向cur的前驅(qū)。
如果頭結(jié)點(diǎn)是要?jiǎng)h除的結(jié)點(diǎn),若按照上面的方法刪除;
遍歷結(jié)束后,頭結(jié)點(diǎn)是未刪除的。
解決辦法:
判斷一下頭結(jié)點(diǎn)是不是要?jiǎng)h除的結(jié)點(diǎn)。
判斷方法:
刪除后:
//鏈表中可能是空的
if(this.head == null) {
return;
}
ListNode cur = this.head.next;//cur指向要?jiǎng)h除的結(jié)點(diǎn)
ListNode prev = this.head;//prev指向要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)
prev.next = cur.next;//要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)的地址域指向key結(jié)點(diǎn)的后驅(qū)的地址域
cur = cur.next;//要?jiǎng)h除的結(jié)點(diǎn)指向它的后驅(qū)
if (this.head.value == key) {
this.head = this.head.next;//將這個(gè)頭結(jié)點(diǎn)指向它的后驅(qū) - 然后就刪除了
}
//刪除所有key的結(jié)點(diǎn)
public void removeAllKey(int key) {
//鏈表中可能是空的
if(this.head == null) {
return;
}
ListNode cur = this.head.next;//cur指向要?jiǎng)h除的結(jié)點(diǎn)
ListNode prev = this.head;//prev指向要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)
//cur不等于空則說明cur未找到尾結(jié)點(diǎn),移動(dòng)要繼續(xù)
while (cur != null) {
//如果當(dāng)前的cur指向的數(shù)據(jù)是我要找的key
if (cur.value == key) {
//改變指向刪除
prev.next = cur.next;//要?jiǎng)h除結(jié)點(diǎn)的前驅(qū)的地址域指向key結(jié)點(diǎn)的后驅(qū)的地址域
cur = cur.next;//要?jiǎng)h除的結(jié)點(diǎn)指向它的后驅(qū)
}else{ //若不是要找的 - 跳到下一個(gè)結(jié)點(diǎn)
prev = cur;//當(dāng)前cur結(jié)點(diǎn)的前驅(qū)指向cur指向的結(jié)點(diǎn)
cur = cur.next;//當(dāng)前cur結(jié)點(diǎn)指向它的后驅(qū)
}
}
//如果鏈表的第一個(gè)結(jié)點(diǎn)是key
if (this.head.value == key) {
this.head = this.head.next;//將這個(gè)頭結(jié)點(diǎn)指向它的后驅(qū) - 然后就刪除了
}
}
釋放單鏈表中每一個(gè)結(jié)點(diǎn)的對象,直接置為空即可。
代碼演示:
public void clear() {
this.head = null;//將的結(jié)點(diǎn)置為空
}
聯(lián)系客服