问题描述:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
算法基本设计思想: 扫描顺序表L中的前半部分元素,对于元素L.data[i](0<=i<L.length/2),将其与后半部分的对应元素L.data[L.length-i-1]进行交换。【注】这里L.data[L.length-i-1]使用举例子找规律方法得到,例如L.data[0]需要与L.data[L.length-0-1]交换,L.data[1]需要与L.data[L.length-1-1]交换,找规律得L.data[i]需要与L.data[L.length-i-1]交换。
代码及结果:
#include<stdio.h> #include "线性表的顺序表示和实现.cpp" void Reverse(SqList &L){ //空间复杂度为O(1),将顺序表逆序 for(int i = 0;i < L.length/2;i++){ int temp = L.data[i]; L.data[i] = L.data[L.length-i-1]; L.data[L.length-i-1] = temp; } } int main(){ //测试Reverse SqList L; //定义一个顺序表 int e; bool flag = InitList_Sq(L); if(flag) printf("构造空的顺序表成功!\n"); else printf("构造顺序表失败!\n"); printf("依次输入要往线性表中输入的元素:"); for(int i = 0;i < 10;i++){ scanf("%d",&e); ListInsert_Sq(L,i+1,e); } printf("顺序表中现有的数据为:"); PrintList(L); Reverse(L); printf("逆序之后的顺序表为:"); PrintList(L); return 0; }