单向循环链表解决猴子选大王问题:
有50只猴子围坐一圈选大王,编号分别是1到50,从第1只猴子开始报数,每报到7的猴子出局,剩下的最后一只猴子就是大王。
这个问题使用单向循环链表解决起来比较简单,废话不多说,直接上代码。
public class CircleLink {
private int size;
Node head;
Node tail;
/**
* 在链表尾部插入一个元素
* @param data 要插入的数据
*/
public void add(int data){
Node newNode = new Node(data);
if(head==null){
newNode.next = newNode;
head = tail = newNode;
}else{
tail.next = newNode;
newNode.next = head;
tail = newNode;
}
size++;
}
/**
* 在链表头部插入一个元素
* @param data 要插入的数据
*/
public void addHead(int data){
Node newNode = new Node(data);
if(head==null){
newNode.next = newNode;
head = tail = newNode;
}else{
tail.next=newNode;
newNode.next=head;
head=newNode;
}
size++;
}
public void delete (Node node){
int data = node.data;
if(node.data == head.data){
deleteHead();
return;
}else {
for(Node temp = head; temp!=tail; temp = temp.next){
if (data==temp.next.data) {
if(temp.next==tail){
deleteTail();
return;
}else {
temp.next = temp.next.next;
size--;
return;
}
}
}
}
System.out.println("指定的目标数据不存在");
}
//遍历链表
public void print(){
Node tempNode=head;
while(tempNode!=tail){
System.out.println(tempNode.data);
tempNode = tempNode.next;
}
System.out.println(tail.data);
}
//获取链表元素个数
public int size(){
return size;
}
class Node{
int data;
Node next;//下一节点
Node(int data){
this.data = data;
this.next = null;
}
}
}
public class Test01 {
public static void main(String[] args){
CircleLink link = new CircleLink();
//初始化循环列表,并赋值
for(int i = 1;i<=100;i++){
link.add(i);
}
CircleLink.Node temp = link.head;
while(link.size()>1){//一直报数下去,直到剩余的元素数量为1
for(int i = 0;i<7;i++){//每报到7,就把报7的元素删除掉
if(i==6){
//打印出圈顺序
System.out.println(temp.data);
link.delete(temp);
}
temp = temp.next;
}
}
link.print();
}
}