03链表-约瑟夫问题

package 约瑟夫问题;

/**

  • 约瑟夫问题–环行链,按顺序出节点
    */
    public class Josepfu {
    public static void main(String[] args) {
    CircleSingleLinkedList csll=new CircleSingleLinkedList();
    csll.add(10);
    csll.show();
    csll.nodeout(2,2,10);

    }

}
class CircleSingleLinkedList{
//创建一个first节点,没有编号
private Jnode first=null;
//添加节点,构成环形链表
public void add(int nums){
//对nums做一个数据教研
if(nums<0){
System.out.println(“nums值不正确”);
return;
}
Jnode cur=null;//辅助指针,帮助构建环形链表
for (int i = 1; i <= nums; i++) {
Jnode temp=new Jnode(i);
if (i1){
first=temp;
first.setNext(first);//让第一个节点自己形成环
cur=first;//让cur节点指向第一节点
}else{//添加剩余节点
cur.setNext(temp);
temp.setNext(first);
cur=temp;
}
}
}
//根据用户的输入,计算出节点的出圈顺序
/**
*
* @param startNo 从第几个节点开始数
* @param countNum 数几下
* @param nums 有多少个节点在圈中
*/
public void nodeout(int startNo ,int countNum,int nums){
//校验
if(first
null||startNo<1||startNo>nums){
System.out.println(“输入不合法,重新输入”);
}
//pre应该指向环形链表最后的节点
Jnode pre=first;
while (true){
if(pre.getNext()first){//
break;
}
pre=pre.getNext();
}
//开始数前,让first和cur先移动startNo-1次到达开始节点
for (int i = 0; i < startNo-1; i++) {
first=first.getNext();
pre=pre.getNext();
}
//开始数时,让first和cur先移动countnum-1次
while (true){
if(pre
first){//此时圈中只有一个节点
System.out.println(“剩下的节点为:”+first.getData());
break;
}
//找到要出圈的节点
for (int i = 0; i <countNum-1; i++) {
first=first.getNext();
pre=pre.getNext();
}
//此时first所在节点,就是要出圈的节点
System.out.println(“出圈节点为:”+first.getData());
//将first指向的节点出圈
first=first.getNext();
pre.setNext(first);
}

}

//遍历当前环形链表
public void show(){
// 判断链表是否为空
if(first==null){
System.out.println(“链表为空”);
return;
}
//因为first不能动,仍然使用辅助指针完成遍历
Jnode cur=first;
while (true){
System.out.println(“数值为:”+cur.getData());
if(cur.getNext()==first){//遍历完
break;
}
cur= cur.getNext();
}
}

}

class Jnode{
private int data;
private Jnode next;
Jnode(int data){
this.data=data;
}

public int getData() {
    return data;
}

public void setData(int data) {
    this.data = data;
}

public Jnode getNext() {
    return next;
}

public void setNext(Jnode next) {
    this.next = next;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值