魔术师发牌问题

魔术师发牌问题_第1张图片

先搞清楚题意:注意按顺序每翻到一张牌放到桌子上,不在手中了,其实是循环链表的问题,可以在纸上模拟一下就可以得到牌开始的顺序。

代码1:(一开始写的比较麻烦)用两个循环链表,一个放数字,一个放序号,边构造边删除,因为翻出来的牌已经放在一边不在手上了,再用一个card数组存放开始的牌的顺序。

#include "stdafx.h"  
#include   
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   
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");
}


你可能感兴趣的:(小程序+数据结构与算法,链表)