package com.tgq.linkedlist; import com.sun.security.jgss.GSSUtil; import javax.xml.crypto.Data; import java.util.Scanner; public class Josepfu { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入环的大小"); int n = sc.nextInt(); CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circleSingleLinkedList.add(n); circleSingleLinkedList.show(); System.out.println("请输入环开始位置"); int a = sc.nextInt(); System.out.println("请输入间隔数"); int b = sc.nextInt(); circleSingleLinkedList.countDate(a, b, n); } } //创建一个环形链表类 class CircleSingleLinkedList { //创建一个first指针一直表示出第一个元素,为后面添加元素建立框架 Date first = new Date(-1); //添加方法,添加数据到环形链表中 public void add(int n) { //判断n是不是一个有效的数据 if (n <= 0) { System.out.println("输入的数据错误"); return; } Date temp = null;//辅助指针,帮助构建环形链表 for (int i = 1; i <= n; i++) { Date date = new Date(i); if (i == 1) { first = date; first.setNext(date);//设置好头指针的指向,目的是为了以后每一个节点都可以指过来形成闭环 temp = date;//date给辅助指针,目的是为了下一次可以调用设置next } else { temp.setNext(date); date.setNext(first); temp = date; } } } //遍历当前环形链表 public void show(){ Date temp = first; if(first == null){ System.out.println("没有数据"); return; } while(true){ System.out.println(temp.getDate()); if(temp.getNext() == first){ break; } temp = temp.getNext(); } } //创建计算方法,输出约束瑟夫环最终值 public void countDate(int satrtNum, int countNum, int nums){ if(first == null || satrtNum < 1 || satrtNum > nums){ System.out.println("输入有误请重新输入"); return; } //要定义两个指针,一个指向当前要出去的节点,一个指向当前的前一个节点,然后用第二个节点跳过当前节点指向下一个节点来起到删除的作用。 //把temp直接知道最后以为就是在第一位的前面了 Date temp = first; while(true){ if(temp.getNext()==first){ break; } temp = temp.getNext(); } //由于statNum的位置不一样,所以我们要把first和temp放到start的位置上 for(int i = 0; i < satrtNum - 1; i++){ first = first.getNext(); temp = temp.getNext(); } //建立循环按照指定位数 while(true){ if(temp == first){ break; } for (int i = 0; i < countNum-1; i++){ first = first.getNext(); temp = temp.getNext(); } System.out.print(first.getDate()); if(temp != first){ System.out.print("=>"); } first = first.getNext(); temp.setNext(first); } System.out.println("最后剩下的人"+first.getDate()); } } //创建数据类 class Date { private int date; private Date next; public Date(int date) { this.date = date; } public int getDate() { return date; } public void setDate(int date) { this.date = date; } public Date getNext() { return next; } public void setNext(Date next) { this.next = next; } }
java循环链表解决约瑟夫环
最新推荐文章于 2024-02-20 19:05:23 发布