魔术师发牌问题,java双向循环链表实现
魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?
用到的类:结点类,用于创建结点,链表的初始化和保存牌序。
/**
* @ClassName: Node
* @Description 本类功能:结点类,用于链表的初始化以及创建结点
* @Author lzl
* @Date 2020.10.04
* @Time 14:52
*/
public class Node < T > {
private T data;
private Node < T > prior;
private Node < T > next;
public Node ( T data , Node < T > prior , Node < T > next ) {
this.data = data;
this.prior = prior;
this.next = next;
}
public T getData ( ) {
return data;
}
public void setData ( T data ) {
this.data = data;
}
public Node < T > getPrior ( ) {
return prior;
}
public void setPrior ( Node < T > prior ) {
this.prior = prior;
}
public Node < T > getNext ( ) {
return next;
}
public void setNext ( Node < T > next ) {
this.next = next;
}
public Node ( ) {
}
}
魔术师发牌类,解决魔术师发牌问题:
/**
* @ClassName: MagicProblem
* @Description 本类功能:解决魔术师发牌问题
* @Author lzl
* @Date 2020.10.04
* @Time 15:19
*/
public class MagicProblem {
public static void main ( String[] args ) {
Node < Integer > head = new Node <> ();
init ( head , 13 );//初始化
licensing ( head );//设置牌序
cardOrder ( head );//输出牌序
}
private static void cardOrder ( Node < Integer > head ) {
String[] poker = new String[] { "♠A" , "♠2" , "♠3" , "♠4" , "♠5" , "♠6" , "♠7" , "♠8" , "♠9" , "♠10" , "♠J" , "♠Q" , "♠K" , };
Node < Integer > temp;
for ( temp = head.getNext (); temp.getNext () != head.getNext () ; temp = temp.getNext () ) {
System.out.print ( poker[ temp.getData () - 1 ] + "-->" );
}
System.out.println ( poker[ temp.getData () - 1 ] );
}
private static void licensing ( Node < Integer > head ) {
head.getNext ().setData ( 1 );
int count = 2;
Node < Integer > temp = head.getNext ();
while ( true ) {
for ( int i = 0 ; i < count ; i++ ) {
temp = temp.getNext ();
if ( temp.getData () != 0 ) {
temp = temp.getNext ();
i--;
}
}
if ( temp.getData () == 0 ) {
temp.setData ( count );
count++;
}
if ( count == 14 ) {
break;
}
}
}
private static void init ( Node < Integer > head , int num ) {
Node < Integer > first = new Node <> ();
head.setNext ( first );
first.setData ( 0 );
first.setNext ( first );
first.setPrior ( first );
for ( int i = 1 ; i < num ; i++ ) {
Node < Integer > temp = new Node <> ();
temp.setData ( 0 );
Node < Integer > end = first.getPrior ();
end.setNext ( temp );
temp.setPrior ( end );
temp.setNext ( first );
first.setPrior ( temp );
}
}
}
程序截图: