一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
- 线性表 14/14
- 链表 7/25
2.3.7, 6
- 把链表数据取出来放到数组里排序,然后再将排好序的数放回链表
- 典型的空间换时间,排序时间复杂度O(nlogn),空间复杂度O(n)
void sortList(LinkList &L, int len) {
// 1.将链表数据复制到数组中
LNode *head = L->next;
int a[len], i = 0;
while (head != NULL) {
a[i++] = head->data;
head = head->next;
}
// 2.排序
sort(a, a+len);
// 3.将排序后的数组复制回链表
head = L->next, i = 0;
while (head != NULL) {
head->data = a[i++];
head = head->next;
}
}
复制代码
- 插入排序,首先构造一个只有一个结点的有序列表pre
- 剩下的p链表中的元素分别找位置插入即可
- 时间复杂度O(n2),空间复杂度O(1)
void sortList2(LinkList &L) {
LNode *p = L->next, *pre;
LNode *q = p->next;
p->next = NULL; // 1.构建只有一个结点的有序链表
p = q;
// 2.分别查找位置插入
while (p != NULL) {
q = p->next;
pre = L;
// 找到有序的位置
while (pre->next != NULL && pre->next->data < p->data) {
pre = pre->next;
}
// 插入
p->next = pre->next;
pre->next = p;
p = q;
}
}
复制代码
2.3.7, 7
- 这题非常的简单,直接遍历逐个检查,不符合就删除
- 双指针,删除必须有其前驱指针
- 时间复杂度O(n),空间复杂度O(1)
void delRange(LinkList &L, int min, int max) {
LNode *p = L->next, *pre = L;
while (p != NULL) {
if (p->data > min && p->data < max) {
// 在范围内就删除
pre->next = p->next;
free(p);
p = pre->next;
} else {
// 不在范围内就继续遍历
pre = pre->next;
p = p->next;
}
}
}
复制代码