编程练习循环链表——魔术师发牌
问题名称:魔术师发牌问题
问题描述:
魔术师手里一共有13张牌,全是黑桃,1~13.
魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),
第一次摸出第一张,是1,翻过来放在桌面上。
第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),
第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)
以此类推 最后一张就是13
## 建立两个数组,类似于循环链表:
## 其中v_l数组存放要按发牌前顺序排放的数值,其初始化为任意值;
## 再建立一个l数组存放每次需要展示数值的地址,初始化为1:13;表示发牌前的排列顺序;并动态调整,如需要展示1时,则牌为1的地址为1,需要展示2的时候,则牌为2的地址为3
n = int(input("please input n:" ))
v_l = [1]*n ## 初始化存储数值
l = list(range(1,n+1)) ## 初始化地址数值
i = 0 ## 标记数数的次数,初始化为0
pos = 1 ## 标记该次要展现的数值,初始化为1
## 循环取数,没进行一次,将地址数值L进行调整,使报过的地址放置在地址数值后面;若数数到了需要展现的数值时,则将该地址去掉,并将对应地址的v_lf赋值为pos
## 在大循环上,每次循环去掉地址数值的某个数,而该数表示的地址即为v_l的地址,其值即为第pos次要展示的数值
while len(l)>=1:
i = i+1
if i == pos:
v_l[l[0]-1] = pos
l = l[1:]
pos = pos+1
i = 0
else:
temp = l[:1]
l.extend(temp)
l = l[1:]
print(str(n)+'张牌的排列顺序为' ,v_l)
please input n:13
13张牌的排列顺序为 [1, 8, 2, 5, 10, 11, 12, 9, 4, 7, 6, 13]