3 回答

TA貢獻1784條經驗 獲得超7個贊
在您的方法中,要刪除的節點是trace.next(您將其稱為del)。這意味著需要將thattrace的next指針更新為trace.next.next,從而有效地“跳過”要刪除的節點 ( trace.next)。這看起來像:trace.next = trace.next.next
相反,您正在做的是trace通過將其設置為trace.next.next. 我知道這是為了使迭代正常工作,但會弄亂您的其余代碼,因為您丟失了指向需要更新的節點的指針。如果我們修改trace.next,循環將trace = trace.next在結束運行時處理正確推進指針。
在 Java 中,不再有指向它的引用的對象會從計算機內存中刪除——這個過程稱為垃圾收集。由于此時我們已經進行了修改trace.next,因此沒有對要刪除的節點的進一步引用,以保留del您創建的變量。一旦該變量在此函數結束時超出范圍,該節點將被垃圾收集,您無需采取進一步行動。你甚至根本不需要 del 變量;一旦我們trace.next通過更新(跳過)舊節點而丟失了對舊節點的引用,就不會再存在對該節點的引用,垃圾收集器將剔除它。
考慮到所有這些,您的代碼就變成了:
public void deletenode(int data) {
Node trace;
for(trace = head; trace != null; trace = trace.next) {
if(trace.next.data == data) {
trace.next = trace.next.next;
}
}
}

TA貢獻1808條經驗 獲得超4個贊
public void deletenode(int data) {
if (head != null && head.data == data) {
head = head.next; // delete head
return;
}
Node prev = null;
Node cur = head;
while (cur != null && cur.data != data) {
prev = cur;
cur = cur.next;
}
prev.next = cur.next; // delete cur
}
添加回答
舉報