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