Day557.单向环形链表 -数据结构和算法Java
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day557.单向环形链表 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。
单向环形链表
一、约瑟夫问题
二、单向环形链表图示
三、构建和遍历的代码实现
package com.achang.linkedlist;
/**
* @Author Achang
* @Date 2022/3/12 15:17
* 约瑟夫问题
**/
public class Josepfu
public static void main(String[] args)
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
circleSingleLinkedList.addBoy(25);
circleSingleLinkedList.list();
//环形单线链表
class CircleSingleLinkedList
//first节点
private Boy first = new Boy(-1);
//添加节点,构成环形链表
public void addBoy(int nums)
//nums数据校验
if (nums < 1)
System.out.println("nums值要求大于1");
return;
Boy curNode = null;//辅助节点,当前位置
//使用for循环创建环形链表
for (int i = 1; i <= nums; i++)
//根据编号,创建小孩节点
Boy boy = new Boy(i);
if (i==1)//如果是第一个节点
first = boy;
first.setNext(first);//构成一个环状
curNode = first;//
else
curNode.setNext(boy);
boy.setNext(first);
curNode = boy;//后移
//遍历环形链表
public void list()
if (first.getNext()==null)
System.out.println("链表为空");
return;
Boy curNode = first;
while (true)
System.out.println(curNode.getNo());
if (curNode.getNext() == first)
break;
curNode = curNode.getNext();
//节点
class Boy
private int no;//编号
private Boy next;//下一个节点
public Boy(int no)
this.no = no;
public int getNo()
return no;
public void setNo(int no)
this.no = no;
public Boy getNext()
return next;
public void setNext(Boy next)
this.next = next;
四、约瑟夫问题的出队方式实现
/**
* 出队
* @param startNo 从第几个小孩开始数
* @param countNum 数几次
* @param nums 初始时总共几个小孩
*/
public void push(int startNo,int countNum,int nums)
if (first.getNext() == null || startNo < 1 || startNo > nums)
System.out.println("不合法状态");
return;
//创建辅助指针,帮助小孩出队
Boy helper = first;
while (true)
//说明指向最后一个节点
if (helper.getNext() == first)
break;
helper = helper.getNext();
//移动位置
for (int i = 0; i < startNo - 1; i++)
first = first.getNext();
helper = helper.getNext();
//出队
while (true)
if (helper == first)//说明圈中只有一个
break;
for (int i = 0; i < countNum - 1; i++)
first = first.getNext();
helper = helper.getNext();
//这是first指向的节点,就是要出队的节点
System.out.println("出队了:"+first.getNo());
//队列删除出队
first = first.getNext();
helper.setNext(first);
System.out.println("最后留在圈中的小孩为:"+first.getNo());
public static void main(String[] args)
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
circleSingleLinkedList.addBoy(5);
circleSingleLinkedList.push(1,2,5);
以上是关于Day557.单向环形链表 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章