已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。
时间: 2024-05-15 08:16:39 浏览: 83
算法思路:
1. 找到第一个大于等于x的结点p,p的前驱结点为pre。
2. 从p开始遍历链表,如果某个结点的值大于等于y,遍历结束。
3. 如果某个结点的值大于x且小于y,删除该结点,释放空间,继续遍历。
4. 如果某个结点的值小于x,将pre指向当前结点,继续遍历。
算法实现:
```
void removeRange(LinkList &L, int x, int y) {
LNode *p = L->next, *pre = L;
while (p && p->data < x) { // 找到第一个大于等于x的结点p
pre = p;
p = p->next;
}
while (p && p->data < y) { // 遍历链表
if (p->data > x) { // 删除大于x小于y的结点
pre->next = p->next;
free(p);
p = pre->next;
} else { // 小于x的结点,pre指向当前结点
pre = p;
p = p->next;
}
}
}
```
时间复杂度:O(n),其中n为链表长度。
相关问题
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写两个不同的算法,删除表中所有值大于 mink 且小于 maxk 的元素,同时释放被删结点空间
算法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);
}
```
已知线性表中的元素以值递增有序排列,并以单链表3作存储结构。试写一算法,删除表中所有值大于 mink 且小于 maxk 的元素,同时释放被删结点空间
算法思路:
遍历整个链表,找到值大于 mink 且小于 maxk 的结点,将其删除。
删除结点时需要注意:
- 删除头结点时,需要将头指针指向下一个结点。
- 删除非头结点时,需要将前一个结点的指针指向当前结点的下一个结点。
同时,需要释放删除结点的空间。
算法实现:
```
void deleteRange(LinkList &L, int mink, int maxk) {
LNode *p = L->next; // 指向第一个结点
LNode *pre = L; // 指向第一个结点的前一个结点
while (p != NULL) {
if (p->data > mink && p->data < maxk) {
pre->next = p->next; // 删除结点
free(p); // 释放空间
p = pre->next; // 指向下一个结点
} else {
pre = p; // 指向下一个结点
p = p->next;
}
}
}
```
注意:以上代码中,假设头结点的值为 -1。
阅读全文