用数据结构C++设计一个算法,删除递增有序链表中值大于 mink 且小于 maxk 的所有元素( mink 和 maxk 是给定的两个参数,其值可以和表中的元素相同,也可以不同)。
时间: 2024-05-09 15:18:36 浏览: 152
算法思路:
由于链表是递增有序的,因此可以通过遍历链表,找到第一个大于等于 mink 的节点,然后从该节点开始,遍历链表,删除所有值小于等于 maxk 的节点。
算法步骤:
1. 定义一个指向头节点的指针 p,初始化为头节点。
2. 从头节点开始,遍历链表,找到第一个大于等于 mink 的节点,将 p 指向该节点。
3. 从 p 开始,遍历链表,删除所有值小于等于 maxk 的节点。
4. 返回删除后的链表头节点。
算法实现:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkedList;
LinkedList createList(int arr[], int len) {
LinkedList head, p, q;
int i;
head = (LinkedList) malloc(sizeof(Node));
head->next = NULL;
p = head;
for (i = 0; i < len; i++) {
q = (LinkedList) malloc(sizeof(Node));
q->data = arr[i];
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
void printList(LinkedList head) {
LinkedList p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
LinkedList deleteRange(LinkedList head, int mink, int maxk) {
LinkedList p = head->next, prev = head, q;
while (p != NULL && p->data < mink) {
prev = p;
p = p->next;
}
while (p != NULL && p->data <= maxk) {
q = p->next;
free(p);
p = q;
}
prev->next = p;
return head;
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int len = sizeof(arr) / sizeof(arr[0]);
LinkedList list = createList(arr, len);
printf("原始链表:");
printList(list);
int mink = 5, maxk = 15;
list = deleteRange(list, mink, maxk);
printf("删除 [%d, %d] 区间后的链表:", mink, maxk);
printList(list);
return 0;
}
```
算法分析:
时间复杂度:O(n),其中 n 是链表中的节点数。最坏情况下,需要遍历整个链表,删除所有节点。
空间复杂度:O(1),只需要常数级别的额外空间。
阅读全文