题目:一堆猴子都有编号,编号是1,2,3 ...m ,
这群猴子(m
个)按照1-m
的顺序围坐一圈,从第1
开始数,每数到第N
个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
解题思路:将围成一圈的m只猴子看作是一个循环链表,从第一个节点(猴子)开始移动(数),到第n个节点(猴子),将它删除,然后从后面一个节点(猴子)继续移动,并从1重新开始计数……直到循环链表中只剩一个节点(猴子)
算法描述:
LinkNode *cl; //定义一个循环表,指向头节点
LinkNode *tcl; //定义一个临时指针
tcl=cl;//指向头节点
while ( Lenth(*cl)>1)//直到链表长度为1
{
for(int i=1;i<=n;i++)//数数1-n
{
if(i!=n)
{tcl=tcl->next;}//不是n往后移动指针
else//是n
{
printf : tcl->next->Num monkey leaves. // 显示编号num的猴子离开
tcl->next=tcl->next->next; //删除该节点
tcl=tcl->next;//移动到下一个
cl=tcl;//重新指定循环列表头节点
}
}
}
自上至下,自左而右打印一棵二叉树(Tree)
算法
解题思路:采用两个队列(Queue)辅助实现。
算法描述:
Tree *t;// 定义一棵二叉树,指向二叉树的根节点
Queue *q1,*q2; //定义两个队列
Push(q1,t); // 将二叉树根节点压入队列q1中
while(q1!=null&&q2!=null) //如果队列q1,q2均为空表示已经打印完毕
{
if(q2==null) //(如果q2为空,q1不为空)
{
while(q1!=null)//直到q1为空结束
{
TreeNode *n=pop(q1); //q1出队
Printf n->Data;//并打印
if(n->LNode!=null)
{push(q2,n->LNode);}// 如果有左孩子,压入队列q2
if(n->RNode!=null)
{push(q2,n->RNode);}// 如果有右孩子,压入队列q2
}
}
if(q1==null) //如果q1为空,q2不为空
{
while(q2!=null)// 直到q2为空结束
{
TreeNode *n=pop(q2); //q2出队
Printf n->Data; //并打印
if(n->LNode!=null)
{push(q1,n->LNode);} // 如果有左孩子,压入队列q1
if(n->RNode!=null)
{push(q1,n->RNode);} // 如果有右孩子,压入队列q1
}
}
}