当前位置:   article > 正文

循环链表及其应用_循环链表的应用

循环链表的应用

目录

1.什么是循环链表?循环链表与单链表的区别?

2.循环链表的应用有哪些?        

3.总结 

4.参考


1.什么是循环链表?循环链表与单链表的区别?

        循环链表是首尾相接的链表,普通链表是尾指针为空。

循环链表结构 一图胜千文

2.循环链表的应用有哪些?        

        约瑟夫环,报数游戏,现在k个人,1,2,3...n报数  比如每次报2的出圈,然后重新报数。

        解决方案:

        方案1 标记+报数  数组模拟

        方案2 使用循环链表模拟报数

 第一次出局  2  4

 第二次出局  1  5

第三次只有一个元素3  循环退出

代码如下

  1. public static void main(String[] args) {
  2. //方法1:使用标记+报数器
  3. // int num = GetLastIndex(5,2);
  4. //方法2:使用循环链表 正确的返回结果是2
  5. int num = GetLastIndex2(5, 2);
  6. System.out.println(num);
  7. }
  8. //标记+报数器
  9. //初始化数组 每个元素都是1
  10. /**
  11. * @Description:
  12. * @Date: 2021/8/9 18:54
  13. * @Author: fuguowen
  14. * @Return k个人的索引的下标 比如2代表第三个人
  15. * @Throws
  16. */
  17. public static int GetLastIndex(int k, int p) {
  18. //k个人
  19. //p报2
  20. int[] arr = new int[k];
  21. //初始化数组都为1
  22. for (int i = 0; i < arr.length; i++) {
  23. arr[i] = 1;
  24. }
  25. int num = arr.length;
  26. //报数器
  27. int flag = 0;
  28. while (num > 1) {
  29. for (int i = 0; i < arr.length; i++) {
  30. if (arr[i] == 1) {
  31. flag++;
  32. if (flag == p) {
  33. //数组清空
  34. arr[i] = 0;
  35. //报数器清空
  36. flag = 0;
  37. //数量减一
  38. num--;
  39. }
  40. }
  41. }
  42. }
  43. for (int i = 0; i < arr.length; i++) {
  44. if (arr[i] == 1) {
  45. return i;
  46. }
  47. }
  48. return 0;
  49. }
  50. //使用循环链表模拟,报数的人删除对应的节点
  51. public static int GetLastIndex2(int k, int reportNum) {
  52. //k个人
  53. //构建循环链表
  54. Node head = CreatCycLinkedList(k);
  55. Node p = head.next;
  56. //队列中元素只有一个的情况是p.next=p ☆☆☆☆☆
  57. while (p.next != p) {
  58. //p.next指向当前要删除的元素
  59. for (int i = 0; i < reportNum; i++) {
  60. p = p.next;
  61. }
  62. //删除元素
  63. p.next = p.next.next;
  64. //指针下移
  65. p.next = p;
  66. }
  67. return p.next.index;
  68. }
  69. public static Node CreatCycLinkedList(int k) {
  70. //构建循环链表
  71. Node head = new Node(-1);
  72. Node cur = head;
  73. for (int i = 0; i < k; i++) {
  74. cur.next = new Node(i);
  75. cur = cur.next;
  76. }
  77. cur.next = head.next;
  78. return head;
  79. }
  80. // 参考:
  81. // 1.https://www.cxyxiaowu.com/1159.html
  82. public class Node {
  83. int index;
  84. Node next;
  85. public Node( int index) {
  86. this.index = index;
  87. }
  88. }

3.总结 

      循环链表的主要应用在约瑟夫环,报数游戏,golang chan底层的数据节后也是循环链表等。它与单链表的区别是循环链表是尾指针指向头指针。普通单链表是尾指针指向null.

4.参考

1.https://www.cxyxiaowu.com/1159.html

     我是厚积薄发, 您的一键三连是我最大的创作动力,请一键三连,如有问题,请留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/831663
推荐阅读
相关标签
  

闽ICP备14008679号