魔术师发牌问题:
问题名称:魔术师发牌问题
问题描述:魔术师手里一共有13张牌,全是黑桃,1~13.
魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),
第一次摸出第一张,是1,翻过来放在桌面上。
第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),
第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)
以此类推 最后一张就是13
方法:
1、创建一个长度为13的单向循环链表,链表中值全部存0
2、遍历链表进行修改值
JAVA代码实现:
package com.briup.Study;
public class MagicPoker {
//定义链表的头节点
private Node head;
//成员内部类Node来实现链表
class Node {
private Integer date;
private Node next;
public Node() {}
public Node(Integer date) {
this(date,null);
}
public Node(Integer date, Node next) {
this.date = date;
this.next = next;
}
public Integer getDate() {
return date;
}
public void setDate(Integer date) {
this.date = date;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
/*构造函数中直接初始化长度为13的循环链表
* 第一个节点的值默认为1*/
public MagicPoker() {
head = new Node(1);
Node p = head;
int i=1;
while(p.next==null&&i<13) {
Node nextNode = new Node(0);
p.next = nextNode;
p = p.next;
i++;
}
//构建循环链表
p.next = head;
}
//打印循环链表
public void myPrint() {
Node p = head;
for(int i=0;i<13;i++) {
System.out.print(p.date+" ");
p = p.next;
}
}
//循环修改节点值(核心代码)
public void magic() {
//指针p指向head用来控制每次指针移动的下一个位置
Node p = head;
//从2开始存到13
for(int i=2;i<=13;i++) {
for(int j=0;j<i;j++) {
p = p.next;
//如果已经有牌,跳过
if(p.date!=0) {
j--;
}
}
p.date=i;
}
}
public static void main(String[] args) {
MagicPoker magic = new MagicPoker();
magic.myPrint();
magic.magic();
System.out.println();
magic.myPrint();
}
}
打印结果:
1 0 0 0 0 0 0 0 0 0 0 0 0
1 8 2 5 10 3 12 11 9 4 7 6 13