2012-05-15 35 views
2

我們正在嘗試編寫一種方法來從LUT的鏈表實現中刪除具有特定鍵的節點。從鏈表LUT中刪除一個節點?

摘要的代碼我寫道:

public void delete (String k) { 

    Node currNode = listHead; 
    Node prevNode = listHead; 

    Key key = new Key (k); 

    while (!currNode.key.equals(k) && currNode != null){ 
     prevNode = currNode; 
     currNode = currNode.next; 
    } 

    if (currNode == listHead) { 
     listHead = listHead.next; 
    } else { 
     prevNode.next = currNode.next; 
    } 
} 

我的朋友基本上寫了同樣的事情,但沒有使用以前的節點指針,而是寫了他的最後一行:

currNode = currNode.next //detach point, override 

這兩者是否相同?我認爲我對Java內存管理感到困惑。
如果您已經創建了listHead節點別的地方,和你寫的:

Node currNode = listHead; 

currNode僅存儲到listHead存儲在存儲位置的參考,對不對?所以在while循環中,當你做currNode = currNode.next時,你正在做的是進入currNode中引用的內存位置,然後查看下一個變量並將參考存儲在currNode中?所以基本上更新currNode指向的地方。這意味着我的朋友的代碼是錯的,對吧?由於他的代碼同樣意味着:「更新currNode中的當前引用,其內存位置爲currNode.next」。

有人會介意幫助我去除霧嗎?

回答

3

你的朋友不可能是對的,因爲必須將.next字段的Node從列表中刪除Node

當我想你知道,從你需要設置節點N-1.next字段以引用節點N+1列表中刪除節點N。你的朋友的方法不可能這樣做,因爲它不會改變任何節點的.next字段。

至於內存,一旦N-1.next字段指的是N+1,那麼N不再被該列表保持活着。它是否符合垃圾回收的條件取決於程序中是否有其他引用。但是這份名單現在已經清洗了它的手。

1

你的分析是正確的 - 你的朋友的代碼實際上不會從列表中刪除節點。

我認爲用調試器逐步調試代碼可能有助於清除霧。如果你還沒有使用集成開發環境(IDE),我建議使用IntelliJ IDEA,Eclipse或Netbeans--它們都包含一個調試器。

2

您已經爲您的查詢得到了正確的答案,但是您的代碼中存在一些不適合評論的錯誤。

NullPointerException

while循環條件是倒退。它應該是

while (currNode != null && !currNode.key.equals(k)) { ... } 

避免NullPointerException,當你到達列表的末尾如果列表中沒有的節點開始說起。

值未發現

該方法不處理情況k不包含在列表中的情況。在while循環之後,您需要檢查currNodenull

if (currNode != null) { 
    if (currNode == listHead) 
     listHead = listHead.next; 
    else 
     prevNode.next = currNode.next; 
}