已知有序表中的元素以值递增有序排列,并以带头结点的单链表作存储结构。 试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析算法的时间复杂度。
时间: 2023-05-30 11:05:29 浏览: 73
算法思路:
1. 找到第一个值大于mink的结点p,记录其前驱结点pre;
2. 从p开始遍历链表,对于每个值大于mink且小于maxk的结点,删除并释放空间;
3. 遍历完后,将pre的next指针指向p的next结点即可。
算法实现:
```
void deleteRange(LinkList &L, int mink, int maxk) {
ListNode *pre = L;
ListNode *p = L->next;
while (p != NULL && p->data <= mink) {
pre = p;
p = p->next;
}
while (p != NULL && p->data < maxk) {
ListNode *q = p;
p = p->next;
pre->next = p;
delete q;
}
}
```
时间复杂度:O(n),其中n为链表长度。因为只需要遍历链表一次即可删除所有符合条件的结点。
相关问题
python已知有序表中的元素以值递增有序排列,并以带头结点的单链表作存储结构。 试写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析算法的时间复杂度。
算法思路:
遍历链表,找到第一个大于mink的结点p,然后从p开始遍历链表,直到找到第一个大于等于maxk的结点q,将p到q之间的结点删除。
算法实现:
```python
def delete_range(head, mink, maxk):
p = head.next
pre = head
while p and p.data <= mink:
pre = p
p = p.next
if not p:
return
q = p
while q and q.data < maxk:
q = q.next
pre.next = q
while p != q:
temp = p
p = p.next
del temp
```
算法分析:
该算法只需遍历一次链表,时间复杂度为O(n),其中n为链表中的结点数。因此,该算法的时间复杂度为O(n)。
已知有序表中的元素以值递增有序排列,并以带头结点的单链表作存储结构。 试用python写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删除结点空间,并分析算法的时间复杂度
算法思路:
1. 找到第一个大于等于mink的结点p和它的前驱结点pre,同时记录pre的位置。
2. 从p开始遍历链表,找到第一个大于maxk的结点q,同时记录q的前驱结点。
3. 从pre开始遍历到q的前驱结点,依次释放这些结点的空间。
4. 将pre的next指针指向q,完成删除操作。
算法实现:
```python
def delete_range(head, mink, maxk):
pre = head
while pre.next and pre.next.data < mink:
pre = pre.next
p = pre.next
while p and p.data <= maxk:
pre.next = p.next
p = p.next
while pre.next and pre.next.data <= maxk:
pre.next = pre.next.next
return head
```
时间复杂度分析:
该算法的时间复杂度为O(n),其中n为链表的长度。因为只需要遍历一次链表,时间复杂度与链表长度成线性关系,因此算法的时间复杂度为O(n)。
阅读全文