双向链表不再双向链接

时间:2018-03-18 22:26:50

标签: java doubly-linked-list

我在撰写一段代码时遇到了一些问题,并希望有人能够帮我看看我出错的地方并解释为什么我能更好地理解它

我被告知我的双向链表不再双向联系,但我没有看到我出错的地方。我将在下面列出有问题的代码部分:

public void deleteWithValue(int searchValue)
{
    // Delete the first node in the list with the given value.
    if (head.data == searchValue)
    {
        head = head.next;
        return;
    }
    DoublyLinkedListNode current = head;
    DoublyLinkedListNode prev = current;
    while (current.next != null)
    {
        prev = current;
        current = current.next;
        if (current.data == searchValue)
        {
            prev = current.next;
            current = current.next;
            current.prev = prev;
            break;
        }
    }
}

非常感谢,

尔杰斯

2 个答案:

答案 0 :(得分:0)

如果条件DataBindings的评估结果为current.data == searchValue,那么您需要更新下一个节点的true链接以及前一个节点的prev链接为了保持双向链接。

目前,您还没有更新next的链接,因此您正在失去该方向的链接。

此外,您将current.prev.next节点视为特殊情况的方式意味着如果head恰好是节点,则current.next.prev不会更新去除。

请考虑一下:

head

答案 1 :(得分:0)

有两个问题:

John3130开始输入这个问题:

if (head.data == searchValue)
{
    head = head.next;
    return;
}

在上述情况下,您忘记将head.prev设置为null。

if (head.data == searchValue)
{
    head = head.next;
    if (head != null) {
        head.prev null;
    }
    return;
}

另一个问题是,当head为空时,是否调用了delete方法。 (假设head==null暗示一个空列表。)在尝试使用head.data时会抛出异常。

您实际上根本不需要“prev”值。从头开始搜索后,只需明智地检查null:

public void deleteWithValue(int searchValue) {

    DoublyLinkedListNode current = head;
    // search
    while ((current != null) && (current.data != searchValue)) {
        current = current.next;   
    }

    if (current != null)  {

        if (current.next != null)  {
           current.next.prev = current.prev;
        }

        if (current.prev != null) {
            current.prev.next = current.next;
        }

        if (current == head) {
            head = current.next;
        }
    }
}