【发布时间】:2016-04-06 01:50:00
【问题描述】:
我无法弄清楚如何删除第一个出现的节点。
到目前为止,这是我删除第一个出现节点的代码。
public boolean remove(E doomedElt)
{
if (head == null)
return false;
else if (doomedElt.equals(head.data))
{
removeFirst();
return true;
}
else
{
DLLNode<E> cursor = head;
while(cursor.next != null && !cursor.next.data.equals(doomedElt))
cursor = cursor.next;
if (cursor.next.next == null && cursor.next.data.equals(doomedElt))
{
removeLast();
return true;
}
else
{
cursor.next = cursor.next.next;
cursor.next.next.prev = cursor.prev; //<---Stuck here.
cursor.prev = cursor.prev.prev; //<---And here.
return true;
}
}
}
这是删除last的代码:
public E removeLast()
{
if (tail == null)
throw new NoSuchElementException("Cannot removeFirst from empty list");
else if (head == tail)
{
E firstOne = head.data;
head = tail = null;
return firstOne;
}
else
{
E lastOne = tail.data;
tail = tail.prev;
tail.next = null;
return lastOne;
}
}
这里是先删除的代码:
public E removeFirst()
{
if (head == null)
throw new NoSuchElementException("Cannot removeFirst from empty list");
else if (head == tail)
{
E firstOne = head.data;
head = tail = null;
return firstOne;
}
else
{
E firstOne = head.data;
head = head.next;
head.prev = null;
return firstOne;
}
}
当我运行我的驱动程序时,它将添加(4, 5, 6 ,5, 7, 6)。从那里我告诉它删除第一个6。我应该在.next 链接(我确实得到)之后得到一个(4, 5, 5, 7 ,6),然后在.prev 链接之后我应该得到(6, 7, 5, 5, 4)。相反,我收到了(6, 7, 4)。
但是,当我删除 cursor.next.next.prev = cursor.prev; 和 cursor.prev = cursor.prev.prev; 时,.prev 链接会回到原来的位置,但只是向后。这意味着我重新连接.prev 链接的逻辑不正确。
有人可以通过绕过节点来帮助解决重新连接 .prev 链接的逻辑。
【问题讨论】:
-
拿一些笔和纸,运行您自己编写的代码,就像您是计算机一样,输入一个简短的列表。它构建了什么,当您手动运行“第一次出现删除”场景时,您看到 prev/next 指针发生了什么?您不需要我们帮助您解决这个问题,您只需要花一点时间来运行您的代码,而不是在文本编辑器中盯着它。
标签: java object linked-list