已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写两个不同的算法,删除表中所有值大于 mink 且小于 maxk 的元素,同时释放被删结点空间
时间: 2023-05-28 15:07:21 浏览: 117
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
算法1:
1. 找到第一个值大于等于 mink 的结点 p,将其前驱结点记为 prev。
2. 从 p 开始遍历链表,找到第一个值大于 maxk 的结点 q,将其前驱结点记为 last。
3. 将 prev 的 next 指针指向 last 的 next 指针,释放 p 到 last 之间的所有结点空间。
示例代码:
```
void deleteRange1(LinkList L, ElemType mink, ElemType maxk) {
Node *prev = L, *p = L->next;
while (p != NULL && p->data < mink) {
prev = p;
p = p->next;
}
Node *last = p;
while (last != NULL && last->data <= maxk) {
last = last->next;
}
prev->next = last;
while (p != last) {
Node *tmp = p;
p = p->next;
free(tmp);
}
}
```
算法2:
1. 创建一个新的头结点 newHead,并将其 next 指针指向原链表的头结点。
2. 找到第一个值大于等于 mink 的结点 p,将其前驱结点记为 prev。
3. 从 p 开始遍历链表,找到第一个值大于 maxk 的结点 q,将其前驱结点记为 last。
4. 将 prev 的 next 指针指向 last 的 next 指针,从 p 开始,释放被删结点空间。
示例代码:
```
void deleteRange2(LinkList L, ElemType mink, ElemType maxk) {
Node *newHead = (Node*)malloc(sizeof(Node));
newHead->next = L;
Node *prev = newHead, *p = L;
while (p != NULL && p->data < mink) {
prev = p;
p = p->next;
}
Node *last = p;
while (last != NULL && last->data <= maxk) {
last = last->next;
}
prev->next = last;
while (p != last) {
Node *tmp = p;
p = p->next;
free(tmp);
}
L = newHead->next;
free(newHead);
}
```
阅读全文