JAVA实现魔术师发牌问题

来源:互联网 发布:mac好用的绘图 编辑:程序博客网 时间:2024/06/05 05:19
魔术师发牌问题:

 问题名称:魔术师发牌问题
 问题描述:魔术师手里一共有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开始存到13for(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


原创粉丝点击