若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该 链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。用C语言
时间: 2024-12-01 21:08:48 浏览: 9
在C语言中,删除链表中的中间节点是一个常见的操作,需要对链表的基本操作有深入理解。这里提供一种基于迭代的方法,因为寻找前驱节点更直观:
首先,我们需要定义链表节点结构体,假设每个节点有一个数据域`data`和两个指针`prev`和`next`,其中`prev`指向前一个节点,`next`指向下一个节点。
```c
typedef struct ListNode {
int data;
struct ListNode *prev;
struct ListNode *next;
} ListNode;
```
然后,我们可以编写一个函数来删除给定的中间节点`node`:
```c
void deleteMiddleNode(ListNode **head, ListNode *node) {
if (!head || !*head) {
// 链表为空或只有一个节点,无需删除
return;
}
// 如果要删除的是头节点的前一个节点
if (node->prev) {
node->prev->next = node->next;
} else { // 否则,如果要删除的是尾节点
ListNode *temp = *head;
while (temp->next != node) {
temp = temp->next;
}
temp->next = NULL; // 将尾节点设置为NULL
}
// 删除目标节点
free(node);
}
```
这个函数首先检查链表是否为空,如果是,则不需要处理。接着,它找到`node`的前一个节点并更新其`next`指针,使其跳过`node`。如果`node`是头节点,那么就直接将头指针移动到`node->next`。
最后,释放`node`所占用的内存,因为现在它不再被链表引用。
阅读全文