循环链表中计算下标的简单算法

今天我在写一个项目的时候突然遇到了一个问题,于是想起以前的数据结构,可是公式我忘了,推到了半节课,当初没有好好学,太难,那本书简直就是天书,不过里面的东西却非常实用。今天就拿出其中一个算法来玩玩,这是从单项循环链表中提取而来的。

 这个项目是用来切换图片,上一张,下一张。我把这些图片读到内存,用数组保存,数组下标用index变量来保存。


 图片
显然下标的范围是:0,1,2,3,4(只有五张图)

图片
0->4这个方向表示上一张;每单击一次“上一张”按钮index就加一
4->0这个方向表示下一张;每单击一次“下一张”按钮index就减一
显然当index等于 4时,单击上一张,index就变成了5,而数组的下标最大为4。
显然当index等于 0时,单击下一张,index就变成了-1,而数组的下标最小为0。

有一个很简单的处理办法就是:(但是这个办法很low)
每次单击上一张的的时候判断index的值,如果index等于5就使index等于0
每次单击下一张的的时候判断index的值,如果index等于-1就使index等于4

于是这个结构就变成了循环链表:
图片
图画的有点丑,自行脑补。


可见这是一个循环的。
于是我推出了一个公式:说明本公式适用于下标从0开始。
假设:数组下标从0开始,最大下标为max,数组长度为length(length==max+1)并定义从0到max方向移动为正方向。指针用Index表示。
正方向移动:index=(length+ (++index))%length;或者index=(++index)%length;
负方向移动:index=(length + (--index))%length;
可见一个数学表达式可以替代一个逻辑判断,算法效率并没有降低。

(想要理解公式,展开推到,不要把这个结构看成直线,而是一个圆环)
说明:
假设max=4;也就是说这个数组长度为5,下标范围[0,4]。
重点分析:
当Index等于4的时候,向正方向移动(++index)
当index等于0的时候,向负方向移动(--index)

当index=4的时候,指针指向最后一个元素,此时将指针向正方向移动,指针的值index应等于0
正方向公式:index=(5 + ++index)%5,化简:(5+5)%5,展开:5%5+5%5=0,good
当index=0的时候,指针指向第一个元素,此时将指针向负方向移动,指针的值index应等于4
负方向公式:index=(5 + --index)%5,化简:(5-1)%5,展开:4%5=4,good 

C语言描述:

图片

图片

转载于:https://www.cnblogs.com/chaeyeon/p/7068428.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值