数据结构-----环形链表

本文介绍了单向环形链表的概念,并详细讨论了约瑟夫问题的解决方案。通过创建环形链表并模拟报数过程,解释了如何在数到m时使编号为k的人出列,直至所有人员出列。文章提供了实现这一过程的思路和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向环形链表

约瑟夫问题

Josephu问题为:设编号为1, 2, …n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生- -个出队编号的序列。

n = 5即有五个人

k=1,从第一个人开始

m=2,数两下

在这里插入图片描述

出队列的顺序是 2——4—–1—–5——-3

思路

1.先创建第一个节点,让我们的first指向该节点,并形成环形

2.后面当我们创建一个新的节点,就把该节点,加入到已有的环形链表中

遍历环形链表

先让一个辅助指针(变量),指向first节点

然后通过一个while循环遍历改环形链表即可当:curBoy.next = first结束

出圈思路

1.需要创建一个辅助指针(变量)helper,事先应该指向环形链表的最后这个节点

当然,我们要小孩报数前,让first和helper移动k-1次,移动到k那个地方

2.当我们的小孩报数时,我们的first和helper同时移动m-1次

3.将我们first指向的小孩 节点出圈

​ first = first.next;

​ helper.next = first;

原来first指向的节点,就没有任何引用了,就会被回收

代码实现

package com.wang.linkedlist;

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/9 21:07
 * @Description TODO
 * @pojectname 算法代码
 */
public class Josepfu {
   
   
    public static void main(String[] args) {
   
   
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoy(5);//加入五个小孩
//        circleSingleLinkedList.showBoy();
        circleSingleLinkedList.countBoy(1,2,5);


    }
}

//创建环形单向链表
class CircleSingleLinkedList{
   
   
    //创建我们的第一个节点,当前还没有编号
    private Boy first = null;

    //添加小孩节点,构建成环形链表
    public void addBoy(int nums)
    {
   
   
        //对我们的nums做一个简单的数据校验
        if (nums<1){
   
   
            System
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会写代码的花城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值