从双向链表中删除节点?

时间:2011-12-15 16:34:23

标签: java

这是链表代码

public class LList
{
protected int size;
protected DNode tail, header; 

public LList()
{
    size = 0;
    tail = null;
    header = tail;
}

public void addDNode(DNode v) 
{
    // means list is empty, so add first element
    if (header == null) 
    {    
        header = v;
        tail = header;  // first element so (head == tail)
    } 
    else 
    {
        tail.setNext(v);
        v.setPrev(tail);
        v.setNext(null);
        tail = v;
    }
    size++;
}

和删除节点方法是问题

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(null)时;它不会让我再次添加一个节点,我认为它与标题和尾部有关。

但是当我使用previous.setNext(tail)时;它似乎没有从列表中删除它?

3 个答案:

答案 0 :(得分:2)

当您删除最后一个元素时,是否忘记将列表的尾部指向上一个元素?

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

答案 1 :(得分:1)

问题是,如果您删除tail,则必须移动它。所以试试

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

您对next也有同样的问题 - 但我相信一旦您完成tail,您就可以轻松解决问题。

答案 2 :(得分:0)

从双向链接列表中删除处理非常棘手。当您在测试时看到错误时,不要只是进行“快速修复” - 返回并准确理解它为什么不起作用,并了解您的预期修复将如何修改所有行为,不仅仅是目前行为不端的那个。

如果仔细考虑一下,就可以解决问题。如果你没有仔细考虑,你会在几个小时内追逐你的尾巴。