我无法弄清楚如何删除第一个出现的节点。
到目前为止,我的代码是删除第一个出现的节点。
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;
}
}
}
以下是删除最后一行的代码:
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
。我应该得到的是(4, 5, 5, 7 ,6)
跟.next
链接(我得到的),并且.prev
链接后我应该(6, 7, 5, 5, 4)
。相反,我得到(6, 7, 4)
。
但是,当我删除cursor.next.next.prev = cursor.prev;
和cursor.prev = cursor.prev.prev;
时,.prev
链接会返回到原始链接,但只会向后移动。这意味着我重新连接.prev
链接的逻辑不正确。
有人可以通过绕过节点来帮助重新连接。prev
链接的逻辑。
感谢。
答案 0 :(得分:1)
此:
cursor.next = cursor.next.next;
cursor.next.next.prev = cursor.prev; //<---Stuck here.
cursor.prev = cursor.prev.prev; //<---And here.
应改为:
cursor.next = cursor.next.next;
cursor.next.prev = cursor;
因为cursor是删除元素之前的位置。即如果你有A B和C而你正在删除B,那么A的下一个应该成为C而C的前一个应该成为A.
请注意,此代码未经测试但应该可以使用 - 如果没有,请告诉我,我会提供更多帮助。