繁体   English   中英

从循环双链表(Java)中删除节点?

[英]Removing nodes from a circular doubly linked list (Java)?

我正在编写一些代码,在其中我需要删除循环链接列表(其头部充当虚拟节点)中的项目并返回它(如果要删除第一个节点)。 我认为我的代码差不多正确,但是我不确定。

我理解正确吗? (从虚拟节点开始)

虚拟-> A-> B-> C-> D->虚拟(环绕到虚拟节点)

因此,如果要删除第一个实际的数据(A),则需要将其分配给temp变量。 因此,节点优先= head.next。 然后,我需要使用虚拟头部引用“ b”,所以我需要做head.next = first.next。 这是所有需要做的吗?

private Node remove()
{
     Node returnNode = head.next;
     head.next = returnNode.next;
     return returnNode;
}

在从列表中删除任何节点N的情况下(假设它在列表中),是否具有相同的概念? 因此,从上面的示例中,我们要删除节点B。在这种情况下,我们需要将B.next = B.previous和B.previous = B.next设置正确吗? 还是我需要做类似B.previous.next = B.next和B.next.previous = B.previous的事情? 我是否需要遍历列表以找到要删除的元素?

private void removeNode(Node n)
{
    n.next = n.previous; // or n.previous.next = n.next
    n.previous = n.next; // or n.next.previous = n.previous
}

双重链接列表意味着每个节点还具有到先前节点的连接。

您的示例将仅切换下一个和上一个引用。 您应该设置:

n。上一个= n。上一个n。上一个

由于您具有循环链接列表,因此只有在添加第一个元素或删除最后一个元素时才有特殊情况。

无论使用单链表,双链表还是循环LL,无论如何都需要遍历列表以进行删除或添加。

现在根据您的问题,您没有提到它是否是双倍LL,但我假设它与您在第二个示例中使用的node.previous一样。

根据我的理解,如果您有一个循环LL的节点,则不必担心该节点是否为头节点,因为无论如何,使用此节点都可以访问所有节点。

现在,如果我能够正确理解您的问题,那么对于您的第一个示例,

如果您需要删除节点(在这种情况下为A),则需要在功能参数中删除该节点。 像这样

// assuming the key exists in your LL.

    private Node remove(Node nodeToBeRemoved)
    {   
        Node returnNode = nodeToBeRemoved
        while(currentNode.data = nodeToBeRemoved.data) {
            returnNode = returnNode.next
        }
        returnNode.previous.next = returnNode.next
        return returnNode;
    }

第二个示例也应如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM