• java单向循环链表(含约瑟夫问题代码展示)


    一:循环链表的思想

    问题:

    思想:如果是第一个结点,自己指向自己,如果结点数不止一个的话的话那么就需要一个辅助结点来判断此时结点到了哪里(类似于之前的temp标记),就是找到链表的在最后一个结点,还需要first始终标记第一个结点。

     

    二:环形链表的搭建

    first标记第一个节点,temp标记最后一个节点(3个必须结点)

    1. public void addBoy(int num) {
    2. if(num < 1) {
    3. System.out.print("数据不正确");
    4. return;
    5. }
    6. //创建第一个结点的标记
    7. Boy first = new Boy(-1);
    8. //创建最后一个结点的标记
    9. Boy temp = null;
    10. for(int i = 1; i <= num; i++) {
    11. Boy boy = new Boy(i);
    12. if(i == 1) {
    13. first = boy;
    14. first.setNext(first);
    15. temp = first;
    16. }else {
    17. temp.setNext(boy);
    18. boy.setNext(first);
    19. temp = boy;
    20. }
    21. }
    22. }

    三:查看循环链表

    和单向链表不同,没有空的头结点

    1. //查看循环链表
    2. public void showBoy() {
    3. if(first == null) {
    4. System.out.print("空链表");
    5. return;
    6. }
    7. Boy boy = first;
    8. while(true) {
    9. System.out.printf("小孩子的编号%d\n" + boy.getNo());
    10. if(boy.getNext() == first) {
    11. break;
    12. }
    13. boy = boy.getNext();
    14. }
    15. }

    四:约瑟夫环问题解决

    约瑟夫环:寻找起始位置->寻找符合步数的结点->出链表(两个必须结点)

    1. public void countBoy(int startno, int countnum, int num) {
    2. if(first == null || startno < 1 || startno > num) {
    3. System.out.print("有问题");
    4. return;
    5. }
    6. Boy helper = first;
    7. while(true) {
    8. if(helper.getNext() == first) {
    9. break;
    10. }
    11. helper = helper.getNext();
    12. }
    13. //寻找起始位置
    14. for(int j = 0; j < startno - 1; j++) {
    15. first = first.getNext();
    16. helper = helper.getNext();
    17. }
    18. //找到出列的那个孩子
    19. while(true) {
    20. if(first == helper) {
    21. break;
    22. }
    23. for(int j = 0; j < countnum - 1; j++) {
    24. first = first.getNext();
    25. helper = helper.getNext();
    26. }
    27. System.out.printf("小孩子%d出列\n",first.getNo());
    28. first = first.getNext();
    29. helper.setNext(first);
    30. }
    31. System.out.printf("最后一个孩子%d出列\n", first.getNo());
    32. }

    结果:

     

  • 相关阅读:
    LeetCode-二叉树的迭代遍历
    力扣刷题-数组-螺旋矩阵
    银行数据中心绿色发展新格局:建设全闪数据中心
    SRM供应商关系管理系统解决方案
    第3章 docker容器管理
    uniapp实现下拉刷新及上拉(分页)加载更多(app,H5,小程序均可使用)
    基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现
    redis部署与管理
    【力扣】994.腐烂的橘子
    [Django框架1]基础知识概要
  • 原文地址:https://blog.csdn.net/qq_56127002/article/details/126329335