先搞清楚题意:注意按顺序每翻到一张牌放到桌子上,不在手中了,其实是循环链表的问题,可以在纸上模拟一下就可以得到牌开始的顺序。
代码1:(一开始写的比较麻烦)用两个循环链表,一个放数字,一个放序号,边构造边删除,因为翻出来的牌已经放在一边不在手上了,再用一个card数组存放开始的牌的顺序。
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
void main()
{
int card[13];
card[0] = 1;
ListNode* head = new ListNode(0);
ListNode* ind_head = new ListNode(1);
ListNode* p = head;
ListNode* ind_p = ind_head;
for (int i = 2; i <13; i++)
{
ListNode* tmp = new ListNode(0);
ListNode* ind_tmp = new ListNode(i);
p->next = tmp;
ind_p->next = ind_tmp;
p = p->next;
ind_p = ind_p->next;
}
p->next = head;
ind_p->next = ind_head;
ListNode* q = head;
ListNode* fq = head->next;
ListNode* ind_q = ind_head;
ListNode* ind_fq = ind_head->next;
int cnt = 1;
int num = 2;
while (fq!=q)
{
cnt++;
if (cnt == num)
{
cnt = 0;
card[ind_fq->val] = num;
num++;
q->next = fq->next;
fq = q->next;
ind_q->next = ind_fq->next;
ind_fq = ind_q->next;
}
else
{
q = q->next;
fq = q->next;
ind_q = ind_q->next;
ind_fq = ind_q->next;
}
}
card[ind_q->val] = num;
system("pause");
}
代码2:看了小甲鱼的视频受到启发
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
void main()
{
//循环链表初始化
ListNode* head = new ListNode(1);
ListNode* p = head;
for (int i = 1; i <13; i++)
{
ListNode* tmp = new ListNode(0);
p->next = tmp;
p = p->next;
}
p->next = head;
ListNode* q = head;
int num = 2;
while (num<14)
{
for (int i = 0; i < num;i++)
{
q = q->next;
if (q->val != 0)//很关键,想清楚,数到实际已经拿出去的牌了就不能算,i--很巧妙
i--;
}
if (q->val == 0)
{
q->val = num;
num++;
}
}
system("pause");
}