2011-12-15 107 views
0

這裏的鏈表代碼從雙向鏈表中刪除節點?

​​

,這就是問題的刪除節點的方法

public DNode removeDnode(DNode current) 
{ 
    if(current.nextNode() == null) 
    { 
     DNode previous = current.prevNode(); 
     previous.setNext(null); 
     current.setPrev(null); 
    } 
    else if (current.prevNode() == null) 
    { 
     DNode next = current.nextNode(); 
     next.setPrev(null); 
     current.setNext(null); 
    } 
    else 
    { 
     DNode next = current.nextNode(); 
     DNode previous = current.prevNode(); 
     previous.setNext(next); 
     next.setPrev(previous); 
     current.setPrev(null); 
     current.setNext(null); 
    } 
    size = size - 1; 
    return current; 
} 

的問題是,當我使用previous.setNext(空);它不會讓我再添加一個節點,我認爲它與標題和尾部有關。然而,當我使用previous.setNext(尾);它似乎並沒有從列表中刪除它?

+0

看起來像功課。 – 2011-12-15 16:36:37

回答

1

問題是,如果你刪除tail,你必須移動它。因此,嘗試

DNode previous = current.prevNode(); 
    previous.setNext(null); 
    current.setPrev(null); 
    tail = previous; 

- 但我相信一旦你與tail完成後,你會很容易解決它,你必須與next同樣的問題。

2

當您刪除最後一個元素時,是否忘記將列表的尾部指向前一個元素?

if(current.nextNode() == null) { 
    DNode previous = current.prevNode(); 
    previous.setNext(null); 
    current.setPrev(null); 
    tail = previous; //isn't this missing?! 
} 
0

處理從一個雙向鏈表中刪除是非常棘手。當您在測試過程中發現錯誤時,請不要僅僅進行「快速修復」 - 請回頭瞭解它爲什麼不起作用,並瞭解您的預期修復方法將如何修改所有行爲,而不僅僅是那種目前行爲不端。

如果您仔細考慮,可以使其工作的最小問題。如果你不仔細考慮,你會追着你的尾巴數小時。