**题目:在带头结点的单链表工中,删除所有值为x的结点,并释放其空间
假设值为x的结点不唯一,试编写算法以实现上述操作。
算法思想:**
(1)定义三个指针 : p 用于遍历链表,pre 用于指向当前节点的前一个节点,q 用于临时存储需要删除的节点。
(2)指针初始化:p 初始化为链表的头节点 L->next,因为头节点通常是 NULL 或者包含数据。 pre始终指向 p 前一个节点的指针。
(3)遍历链表:使用 while 循环遍历链表,直到 p 为 NULL,即链表末尾。并在循环内部,首先检查当前节点 p 的数据 p->data 是否等于要删除的值 x。
如果找到要删除的节点(p->data == x)执行以下步骤:
<1>将 q 指向当前节点 p,以便稍后释放内存。
<2>将 p 移动到下一个节点 p->next。
<3>将 pre 的 next 指针指向 p,从而跳过当前要删除的节点。
<4>释放 q 指向的内存。
如果当前节点不是要删除的节点,将 pre 更新为 p,然后 p 移动到下一个节点。
void delete_x(LintLink &L, Elemtype x) {
LNode *p = L->next, *pre = L, *q;
while(p != NULL) {
if(p->data == x) { // 找到要删除的节点
q = p; // 找到待删除x,赋值给q
p = p->next; // p遍历到下一个节点
pre->next = p; // 删除x
free(q);
} else { // 未找到要删除的节点
pre = p;
p = p->next;
}
}
}