题目要求
关于逆置,有一种非常暴力的解决方法,就是单独开辟一个同等大小的线性表,然后新表从前往后遍历,同时原表从后往前遍历,依次赋值,最后得到的就是逆置后的线性表。
但这种方法的空间复杂度为O(n),所以并不能这么做。而且题目要求的是线性表编程过程中可直接定位的顺序表,所以没必要那么浪费空间,只需让顺序表中的数据元素头尾依次调换即可。
基本思想
从下标为0的元素开始,扫描顺序表L中的前半部分元素,将L.data[i]与L.data[L.length-i-1]对调。
核心代码
这里采用静态分配空间的顺序表
void Reverse(SqList &L)
{
ElemType temp;//临时空间
for (int i = 0; i < L.length/2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
完整代码(C++)
//函数功能:
//将顺序表L的所有元素逆置,算法的空间复杂度为O(1)
#include<iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
void Reverse(SqList &L)
{
ElemType temp;//临时空间
for (int i = 0; i < L.length/2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
void printList(SqList L)
{//打印顺序表
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
}
void main()
{
SqList L = { 1, 2, 3, 4, 5, 6 };
L.length = 6;
printList(L);
Reverse(L);
printList(L);
}