数组实现环形链表

 没想通怎么满额复用初始化队列空间,因为实际有效的存储位会少一个

package com.kali.structure;

/**
 * 前提:这是一个环形队列,目的为了复用空间
 *      通过取模算法用数组来实现队列并可复用
 *      1.队列为空的条件判断
 *          front == rear
 *      2.队列满的条件判断
 *          (rear+1) % maxSize == front
 *      3.添加元素
 *          rear = (rear+1) % maxSize
 *      4.获取元素
 *          front = (front+1) % maxSize
 *      ********* 3、4步取模原因是为了让指针周期性复用
 *      5.遍历元素
 *          front + offset()
 *          解析:maxSize - front得到之后元素,加上rear中间的叠加区直接取maxSize模可得
 *          offset = (maxSize - front + rear) % maxSize
 *      6.获取头元素
 *          return queue[front]
 *      在算法的设计过程中将一个位置空出来作为约定,所以实际的有效元素会少一个
 *      这个所谓的约定就是一个预留空间,始终在rear的后一个位置
 */
public class RingQueue {
    private int front;
    private int rear;
    private int maxSi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尝试回答你的问题。 首先,让我们来了解一下约瑟夫环问题的描述:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,下一个人再从1开始报数,直到剩下最后一个人。 为了解决这个问题,我们可以使用一个数组来模拟双链表的结构。数组中的每一个元素都代表一个人,同时包含两个指针,一个指向它前面的人,一个指向它后面的人。我们可以将这个数组看作一个环形结构,最后一个人的后继指针指向第一个人,第一个人的前驱指针指向最后一个人。 具体实现流程如下: 1. 定义一个长度为n的数组a,用来表示n个人。 2. 初始化数组a中每个元素的值,使其表示对应的人,并将每个元素的前驱和后继指针初始化为前一个和后一个元素的下标。 3. 定义一个指针p,指向数组a中的第一个元素。 4. 定义一个变量count,用来计数,初值为1。 5. 从第一个人开始报数,每报一次,count加1。 6. 当count等于m时,将当前指针p所指向的元素从a中删除,即将其前驱指针的后继指针指向其后继指针,后继指针的前驱指针指向其前驱指针。 7. 将指针p移动到下一个未被删除的元素。 8. 如果删除的元素是最后一个元素,将指针p指向下一个未被删除的元素。 9. 重复步骤5-8,直到数组a中只剩下一个元素。 10. 返回最后剩下的元素。 这样,我们就可以使用数组模拟双链表来解决约瑟夫环问题了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值