📅  最后修改于: 2023-12-03 15:37:05.292000             🧑  作者: Mango
双向循环链表是一种常见的数据结构,每个节点都有前驱节点和后继节点,并且首尾节点相接成环。删除节点是链表操作中的一项基本操作,本文将介绍如何在双向循环链表中删除节点。
为了方便操作,我们可以使用一个结构体来表示一个节点:
typedef struct ListNode {
int val;
struct ListNode* prev;
struct ListNode* next;
} ListNode;
其中val
表示节点的值,prev
和next
分别表示前驱节点和后继节点。
在双向循环链表中删除节点需要注意以下几个问题:
下面给出具体的实现:
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);
}
上面的代码中,首先判断了节点是否为空,然后分别处理了三种情况:
最后释放节点的内存。
本文介绍了如何在双向循环链表中删除节点,需要注意头节点和尾节点的特殊处理。在实际开发中,我们可以根据具体需求来扩展链表的功能,例如插入节点、查找节点等。