学习笔记-数据结构-线性表(2024-04-27)

设计一个高效算法,将顺序表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;
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值