[英]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.