AB33-将顺序表中的元素逆置(原地逆置)
代码实现
| C |
|---|
| /**
* 将顺序表中的元素逆置(原地逆置)
* @param L 指向顺序表的指针
*/
void Reverse_L(Sqlist *L) {
// 初始化双指针:i指向第一个元素,j指向最后一个元素
int i = 0; // 前指针,从数组开头开始
int j = L->length - 1; // 后指针,从数组末尾开始
// 双指针向中间移动,直到相遇
for (; i < j; i++, j--) {
// 交换两个指针所指向的元素
int temp = L->data[i]; // 临时存储前指针元素
L->data[i] = L->data[j]; // 将后指针元素赋值给前位置
L->data[j] = temp; // 将前指针元素赋值给后位置
}
}
|
算法原理图解
| Text Only |
|---|
| 初始状态:[1][2][3][4][5]
↑ ↑
i j
第一次交换后:[5][2][3][4][1]
↑ ↑
i j
第二次交换后:[5][4][3][2][1]
↑
i=j(结束)
最终结果:[5][4][3][2][1]
|
复杂度分析
时间复杂度:O(n)
- 分析过程:
- 循环次数:n/2次(双指针从两端向中间移动)
- 每次循环执行:3次赋值操作(常数时间)
- 总执行次数:3 × (n/2) = 1.5n
- 忽略常数系数,时间复杂度为 O(n)
空间复杂度:O(1)
- 分析过程:
- 只使用了3个额外变量:
i、j、temp
- 这些变量占用的空间不随输入规模n的变化而变化
- 因此空间复杂度为 O(1)(原地算法)
算法特点
优点:
- 原地逆置,空间效率高
- 实现简单,逻辑清晰
- 时间复杂度线性,效率较高
核心思想:
使用双指针技术,从数组两端开始,逐步向中间靠拢,每次交换对应位置的元素,实现整体逆置。