设已知线性表中的元素(整数)以值递增有序排列,并以单链表作为存储结构。请用C语言写一个高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析算法的时间复杂度(注意,mink和maxk是给定的两个参变量,它们的值为任意整数
时间: 2024-01-24 08:16:43 浏览: 77
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
算法思路:
遍历单链表,找到第一个大于等于mink的节点,记录其前驱节点pre和当前节点p。
从p节点开始,遍历单链表,对于每个节点,如果其值小于等于maxk,则将其链接到pre节点后面,否则直接删除该节点。
时间复杂度分析:
该算法只需遍历一遍单链表,时间复杂度为O(n),其中n为单链表的长度。
C语言代码实现:
```
void deleteRange(Node **head, int mink, int maxk) {
Node *p = *head, *pre = NULL;
while (p != NULL && p->data < mink) {
pre = p;
p = p->next;
}
while (p != NULL && p->data <= maxk) {
if (pre == NULL) {
*head = p->next;
free(p);
p = *head;
} else {
pre->next = p->next;
free(p);
p = pre->next;
}
}
while (p != NULL) {
if (p->data > maxk) {
break;
}
Node *tmp = p;
p = p->next;
free(tmp);
}
if (pre != NULL) {
pre->next = p;
} else {
*head = p;
}
}
```
阅读全文