设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
算法思想:
扫描顺序表L的前半部分元素,对于元素L.data[i](0<=i<L.length/2)将其与后边部分的对应元素L.data[length-i-1]进行交换。
使用双指针技术,即用两个指针分别指向顺序表的首尾元素,然后交换这两个元素的位置,之后将指针向中间移动,继续交换,直到两个指针相遇或者错过
算法伪代码:
n = LENGTH(L) // L的长度
i = 0 // 初始化指针i指向首元素
j = n - 1 // 初始化指针j指向尾元素
WHILE i < j DO
// 交换L[i]和L[j]
TEMP = L[i]
L[i] = L[j]
L[j] = TEMP
// 移动指针,i向后移动,j向前移动
i = i + 1
j = j - 1
END WHILE
实现:
void reverseArray(SqList &L) {
int i = 0; // 首元素索引
int j = L.length - 1; // 尾元素索引
ElemType temp; // 用于交换元素的临时变量
// 当i < j时,交换arr[i]和arr[j]
while(i < j) {
temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
i++; // i向后移动
j--; // j向前移动
}
}
转换为for循环实现
void Reverse(SqList &L)
{
ElemType temp;//辅助变量
for(int i=0;i<L.length/2;i++)
{
temp=L.data[i];//交换L.data[i]与L.data[length-i-1]
L.data[i]=L.data[length-i-1];
L.data[length-i-1]=temp;
}
}