魔术师发牌问题
问题描述:
手中有同色扑克十三张(1~13),背面朝上,翻开第一张为1,将其放在桌面,对于剩下的12张牌,将第一张放在牌底,第二张翻开为2,将2放在桌面,对于手中剩下的11张牌,第一张放在牌底,第二张放在牌底,第三张翻开为3,依次类推,求牌的排列顺序。
解决思路:
需要求排列顺序,链表初始数据肯定为空,需要向链表中填写数据,那么填写了数据的结点就应被翻开,并置于桌面,说明这些结点不参与循环,因此可以得知,参与循环的只是空结点。
那么就可以将判定条件设置为判断该结点是否为空,如果为空,则计数器加一,到达目标结点时,填写数据,否则指向下一个空结点,直至所有数据填写完毕。
代码如下:
package List;
public class Magic {
public Node root;
public Node rnode;
public void Magic_init(){
root=new Node();
root.next=root;
rnode=new Node();
rnode.next=root;
for (int i=1;i<=13;i++) {
Node node=new Node();
node.setData(null);
node.next=root;
rnode.next.next=node;
rnode.next=node;
}
rnode.next.next=root.next;
}
public void Mageic_print(){
//pnode指向的是添加数据的位置
Node pnode=new Node();
pnode.next=root;
int i=1,j=1;
while (i<=13){
while (j<=i){
if(pnode.next.next.getData()==null){
j++;
}
pnode.next=pnode.next.next;
}
pnode.next.setData(i);
j=1;
i++;
}
Node pnode1=new Node();
//初始化指向头结点,若下节点不为尾结点则输出下结点
pnode1.next=root;
while (pnode1.next.next!=rnode.next){
System.out.print(pnode1.next.next.getData()+",");
pnode1=pnode1.next;
}
//尾结点独立输出
System.out.println(rnode.next.getData());
}
public static void main(String[] args){
Magic ma=new Magic();
ma.Magic_init();
ma.Mageic_print();
}
}
运行结果: