已知线性表中的元素(整数)以值递增有序排列,并以单链表做存储结构。试写一高效的算法,删除表中所有值大于mink 且小于maxk的元素(若表中存在这样的元素)同时释放被删除节点空间,分析你的算法的时间复
时间: 2023-04-24 20:02:27 浏览: 239
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
杂度。
算法思路:
1. 找到第一个大于等于mink的节点p,以及p的前驱节点pre。
2. 从p开始遍历链表,删除所有值大于mink且小于maxk的节点,同时释放被删除节点的空间。
3. 将pre的next指针指向第一个大于等于maxk的节点q。
4. 从q开始遍历链表,删除所有值大于等于maxk的节点,同时释放被删除节点的空间。
5. 返回删除操作后的链表头节点。
算法实现:
```
typedef struct Node {
int data;
struct Node *next;
} Node, *List;
List deleteRange(List L, int mink, int maxk) {
Node *p = L->next, *pre = L;
while (p && p->data < mink) {
pre = p;
p = p->next;
}
while (p && p->data >= mink && p->data < maxk) {
Node *q = p->next;
pre->next = q;
free(p);
p = q;
}
while (p && p->data >= maxk) {
Node *q = p->next;
free(p);
p = q;
}
return L;
}
```
时间复杂度分析:
1. 找到第一个大于等于mink的节点需要遍历链表,时间复杂度为O(n)。
2. 删除所有值大于mink且小于maxk的节点需要遍历链表,时间复杂度为O(n)。
3. 找到第一个大于等于maxk的节点需要遍历链表,时间复杂度为O(n)。
4. 删除所有值大于等于maxk的节点需要遍历链表,时间复杂度为O(n)。
综上所述,算法的时间复杂度为O(n)。
阅读全文