设计一个高效算法,将顺序表 L 的所有元素逆置,要求算法的空间复杂度为 O(1),用C语言实现
时间: 2024-10-04 22:03:22 浏览: 53
设计一个高效的算法来逆置顺序表(数组)L的所有元素,使其空间复杂度保持在O(1),意味着我们不需要额外的空间。我们可以使用两个指针,一个指向列表的开始(front),另一个指向结束(rear)。同时更新这两个指针的位置,并交换它们所指向的元素,直到两者相遇。
以下是C语言的具体实现:
```c
#include <stdio.h>
// 交换两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 逆置顺序表 L 的函数
void reverseArrayInPlace(int* L, int size) {
if (size <= 1) return; // 如果长度为1或0,无需操作
int front = 0, rear = size - 1; // 设置初始指针位置
while (front < rear) { // 当前指针未超过边界
swap(&L[front], &L[rear]); // 交换前端和后端元素
front++; // 前进前端指针
rear--; // 后退后端指针
}
}
// 测试函数
int main() {
int L[] = {1, 2, 3, 4, 5};
int size = sizeof(L) / sizeof(L[0]);
printf("Original array: ");
for (int i = 0; i < size; i++) {
printf("%d ", L[i]);
}
reverseArrayInPlace(L, size);
printf("\nReversed array: ");
for (int i = 0; i < size; i++) {
printf("%d ", L[i]);
}
return 0;
}
```
运行此程序会看到原数组和逆序后的数组。这个算法的时间复杂度是O(n),因为需要遍历整个数组一次,空间复杂度是O(1),因为我们仅使用了固定大小的临时变量。
阅读全文