这是链表代码
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)时;它似乎没有从列表中删除它?
答案 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)
从双向链接列表中删除处理非常棘手。当您在测试时看到错误时,不要只是进行“快速修复” - 返回并准确理解它为什么不起作用,并了解您的预期修复将如何修改所有行为,不仅仅是目前行为不端的那个。
如果仔细考虑一下,就可以解决问题。如果你没有仔细考虑,你会在几个小时内追逐你的尾巴。