让你更好的了解链表-链表解决猴子,小朋友报数问题

简要分析一下题目,就是总共多少个小朋友,从第一个小朋友开始报数,比如报到3就退出一个,当剩下最后一个小朋友时,读出他的编号,并且退出。

关于这个题目的逻辑关系就是线性关系,而像这种线性关系一般都是相对非线性关系比较好解,这个题目在网上也有多种多样的解法,比如静态数组解法,动态数组解法,约瑟夫环等等,由于是线性关系,所以楼楼想到链表也是可以解的,解法就是循环链表,个人感觉,除了约瑟夫环,和别的解法效率差不多,但是好处就是数据对题目的立体化,个性化,以及层次化!


代码如下:


#include<iostream>
using namespace std;
/*
*left 的指向就是小朋友左手边的小朋友
*right 的指向就是小朋友右手边的小朋友
num 指的就是小朋友自己的编号
*/
typedef struct Lnode{
int num;
struct Lnode *left;
struct Lnode *right;
}Lnode, *Link;
/*
创建链表,使小朋友围成一个圈
注意的是到最后一个小朋友时,之前的
第一个小朋友要单独出一个指针变量寄存,
这样第一个小朋友的左手就能牵到最后一个小朋友的右手了!
*/
void CreatLink(Link &pp, int k){
Lnode *p1 = pp;
Lnode *L;
int i;
for(i = 2; i <= k; i++){
L = (Link)malloc(sizeof(Lnode));
L -> num = i;
L -> left = p1;
p1 -> right = L;
if(i == k){
L -> right = pp;
pp -> left = L;
}
p1 = L;
}
}


void DeleteLink(Link &k1){
k1 -> left -> right = k1 -> right;
k1 -> right -> left = k1 ->left;


}


int main(){
Lnode *p;
Lnode *L;
int k, count, j;//k表示总共有多少人  count表示报几次就退出
cin>>k>>count;
p = (Link)malloc(sizeof(Lnode));
(*p).num = 1;;
CreatLink(p, k);
while(k != 0){
for(j = 0; j < count-1; j++){
p = p -> right;
}
DeleteLink(p);
p = p -> right;
k--;
}
cout<<p->num<<endl;
return 0;
}


小小分析下,链表的好处,大家也知道,对于删除一个元素来的非常之快,非常之简便,所以当删除的时候,把该要被删除的孩子的左手边的孩子的右手,牵住要被删除的孩子的右手边的左手,那么久牵手成功,哈哈,是不是有点绕啊!

个人感觉用链表解这个题目更加简单明了,许多变量,计数器啊也省去了不少!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值