2011-12-15 109 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

处理从一个双向链表中删除是非常棘手。当您在测试过程中发现错误时,请不要仅仅进行“快速修复” - 请回头了解它为什么不起作用,并了解您的预期修复方法将如何修改所有行为,而不仅仅是那种目前行为不端。

如果您仔细考虑,可以使其工作的最小问题。如果你不仔细考虑,你会追着你的尾巴数小时。