📜  双向循环链表|设置 2(删除)(1)

📅  最后修改于: 2023-12-03 15:37:05.292000             🧑  作者: Mango

双向循环链表 - 删除节点

双向循环链表是一种常见的数据结构,每个节点都有前驱节点和后继节点,并且首尾节点相接成环。删除节点是链表操作中的一项基本操作,本文将介绍如何在双向循环链表中删除节点。

数据结构

为了方便操作,我们可以使用一个结构体来表示一个节点:

typedef struct ListNode {
    int val;
    struct ListNode* prev;
    struct ListNode* next;
} ListNode;

其中val表示节点的值,prevnext分别表示前驱节点和后继节点。

删除节点

在双向循环链表中删除节点需要注意以下几个问题:

  1. 对于头节点,需要特殊处理。
  2. 对于尾节点,需要同样特殊处理。
  3. 删除节点时,需要删除它的前驱节点和后继节点之间的引用。

下面给出具体的实现:

void deleteNode(ListNode* node) {
    if (node == NULL) {
        return;
    }

    if (node->prev == node && node->next == node) {
        // 只有一个节点
        free(node);
        return;
    }

    if (node->prev == NULL) {
        // 删除头节点
        node->next->prev = NULL;
    } else if (node->next == NULL) {
        // 删除尾节点
        node->prev->next = NULL;
    } else {
        // 删除普通节点
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }

    free(node);
}

上面的代码中,首先判断了节点是否为空,然后分别处理了三种情况:

  1. 如果只有一个节点,直接释放内存即可。
  2. 如果是头节点,将头指针指向它的后继节点,并将后继节点的前驱指针置为空。
  3. 如果是尾节点,将尾指针指向它的前驱节点,并将前驱节点的后继指针置为空。
  4. 如果是普通节点,将它的前驱节点的后继指针指向它的后继节点,将它的后继节点的前驱指针指向它的前驱节点。

最后释放节点的内存。

总结

本文介绍了如何在双向循环链表中删除节点,需要注意头节点和尾节点的特殊处理。在实际开发中,我们可以根据具体需求来扩展链表的功能,例如插入节点、查找节点等。