【问题标题】:Doubly Linked List, Removing First Occurrence双向链表,去除第一次出现
【发布时间】: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


【解决方案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;

因为光标是元素被移除之前的位置。 IE。如果你有 A B 和 C 并且你正在移除 B,那么 A 的下一个应该变成 C,C 的前一个应该变成 A。

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

【讨论】:

  • 哦...我明白为什么我的代码是错误的了。当我有代码cursor.next = cursor.next.next; 根据.next 链接时,没有B 它只是(A,C)。然后从那里我告诉光标跟随.next 然后.prev 回到它自己。一直以来,我一直认为 B 在那里,直到所有链接都绕过 B。谢谢。
  • 没问题,乐于助人
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2023-02-13
  • 2014-10-13
  • 2023-03-25
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多