(Java)双重链接列表,删除首次出现。

时间:2016-04-06 01:50:00

标签: java object linked-list

我无法弄清楚如何删除第一个出现的节点。

到目前为止,我的代码是删除第一个出现的节点。

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链接的逻辑。

感谢。

1 个答案:

答案 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.

请注意,此代码未经测试但应该可以使用 - 如果没有,请告诉我,我会提供更多帮助。