设计一个高效算法,将顺序表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;
	}
}
05-06 06:03