用Java创建一个循环链表例子

来源:互联网 发布:java编程培训教程 编辑:程序博客网 时间:2024/05/29 14:20

题目:一群人围在一起丢手绢,开始指定从第m个人开始,然后瞬时针数k下,第k个人出列,剩下的人继续从0开始数到k,第k个人再次出列,问,最后一个人是谁?

代码如下:

package com.cyclink;public class CycLink {public static void main(String[] args) {// TODO Auto-generated method stubLink cyc = new Link();cyc.setLen(5);cyc.createLink();cyc.setK(2);cyc.setM(2);cyc.print();cyc.play();}}//创建一个节点类class Node{//编号public int num;//保存下一个节点Node next;//默认构造函数public Node() {}//构造函数public Node(int num){this.num = num;}}//创建一个循环链表class Link{//保存链表的长度public int len = 0;//保存游戏从第k个人开始public int k = 0;//保存游戏数多少下public int m = 0;//设置一个头节点Node head = new Node(0);//设置一个临时节点Node temp = null;//设置链表长度public void setLen(int len){this.len = len;}//设置k的值public void setK(int k){this.k = k;}//mpublic void setM(int m){this.m = m;}//生成循环链表 public void createLink(){for(int i = 1;i <= len;i++){if(i == 1){Node node = new Node(i);head.next = node;temp = node;}else if(i < len){Node node = new Node(i);temp.next = node;temp = node;}else{Node node = new Node(i);temp.next = node;node.next = head;}}}//开始玩游戏public void play(){//临时节点置空temp = null;//用temp1存放temp之前一个节点Node temp1 = null;temp = head.next;temp1 = head;//找到第k个人的位置for(int i = 1;i < k;i++){temp = temp.next;temp1 = temp1.next;}//数多少下while(len == 1){for(int j = 1;j < m;j++){temp = temp.next;temp1 = temp1.next;}//删除temp节点temp1.next = temp.next;//链表长度减1len--;}//输出结果System.out.println("\n" + "最后一个数为:" + temp.num);}//输出循环链表public void print() {temp = null;temp = head.next;while(temp != head){//输出该节点的编号System.out.print(temp.num + "\t");temp = temp.next;}}}