【问题标题】:Removing nodes from a circular doubly linked list (Java)?从循环双向链表(Java)中删除节点?
【发布时间】:2018-08-30 02:27:34
【问题描述】:

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

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

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

因此,如果我想删除第一个实际数据(A),我需要将它分配给一个临时变量。所以 Node first = 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
}

【问题讨论】:

  • 如果有人解决了您的问题或为解决方案做出了贡献,那么投票并标记包含解决方案的答案将是一种友好/最佳做法。

标签: java linked-list doubly-linked-list circular-reference


【解决方案1】:

双链表意味着每个节点也与前一个节点有连接。

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

n.next.previous = n.previous n.previous.next = n.next

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

【讨论】:

  • 好吧,太棒了,所以我当时走在了正确的轨道上。删除第一个元素(我的第一个 sn-p 代码)是正确的方法吗?
【解决方案2】:

在任何情况下都需要遍历链表进行删除或添加,无论是使用单链表还是双链表还是循环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;
    }

第二个例子也应该如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多