📅  最后修改于: 2023-12-03 15:22:00.836000             🧑  作者: Mango
在一些特定的场景下,我们可能需要使用没有头指针的链表。这种链表通常没有一个指向链表头的指针,而是从链表的第一个节点开始遍历。对于这种链表,我们需要一种特殊的方式来删除其中的一个节点。
通常情况下,我们删除链表中的一个节点需要知道该节点的前驱节点。然而,在没有头指针的链表中,我们无法直接获取前驱节点的指针。因此,我们需要使用一个技巧:将被删除节点的值替换为它的后继节点的值,然后删除后继节点。
具体实现代码如下(假设节点类型为Node
,链表类型为LinkedList
):
void LinkedList::delete_node(Node* node)
{
// 被删除节点是尾节点
if (node->next == NULL) {
Node* tmp = head;
while (tmp->next != node) {
tmp = tmp->next;
}
tmp->next = NULL;
delete node;
return;
}
// 被删除节点不是尾节点
Node* tmp = node->next;
node->val = node->next->val;
node->next = node->next->next;
delete tmp;
}
在使用这种方式删除节点时,需要注意以下几点:
通过这种方式,我们可以在没有头指针的链表中删除一个节点。但是,这种方式比较麻烦,容易出错,因此在实际开发中建议使用带头结点的链表。