已知单链表l是一个递增有序表,试编写一高效算法,删除表中值大于min且小于max的结点(若表中有这样的结点),同时释放被删除结点的空间,这里min和max是两个参数。请分析算法的时间复杂度。
时间: 2023-06-05 14:47:11 浏览: 239
实现在单链表中删去值相同的多余结点的算法.txt
算法思路:
1. 首先判断链表是否为空,若为空则直接返回。
2. 找到第一个值大于等于min的结点p,以及它的前驱结点pre。
3. 从p开始遍历链表,若当前结点的值小于等于max,则删除该结点,同时释放空间。
4. 若当前结点的值大于max,则直接返回。
5. 时间复杂度为O(n),其中n为链表长度。
算法实现:
```
void deleteRange(ListNode* &head, int min, int max) {
if (head == nullptr) return;
ListNode *p = head, *pre = nullptr;
while (p != nullptr && p->val < min) {
pre = p;
p = p->next;
}
while (p != nullptr && p->val <= max) {
ListNode *tmp = p;
p = p->next;
delete tmp;
}
if (pre == nullptr) head = p;
else pre->next = p;
}
```
注意事项:
1. 需要注意链表为空的情况。
2. 需要注意min和max的大小关系,若min大于max,则直接返回。
3. 需要注意删除结点时,要先保存下一个结点的指针,否则会出现指针丢失的问题。
阅读全文