有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

因此,如果我想删除第一条实际数据(A),我需要将其分配给一个临时变量。所以Node first=head。下一个然后我需要有一个虚拟的头部参考“b”,所以我需要做头部。下一个=第一个。下一个这就是我们需要做的一切吗

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。上一个?我是否需要遍历列表以查找要删除的元素

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
}

共 (2) 个答案

  1. # 1 楼答案

    在任何情况下,您都需要遍历列表以删除或添加,无论您使用的是单链接列表、双链接列表还是循环列表

    现在根据您的问题,您没有提到它是否是一个双LL,但我假设它是您使用的节点。在您的第二个示例中,前面提到了

    根据我的理解,如果你有一个循环LL的节点,你不必担心这个节点是否是head,因为不管怎样,所有节点都可以使用这个节点访问

    如果我能正确理解你的问题,那么对于你的第一个例子

    如果需要删除节点(在本例中为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;
        }
    

    第二个例子也是如此

  2. # 2 楼答案

    双链接列表意味着每个节点也有一个到上一个节点的连接

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

    下一个。先前的,先前的 n、 以前的。下一个

    因为您有一个循环链表,所以只有在添加第一个元素或删除最后一个元素时才会出现特殊情况