您的位置:首页 > 其它

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

2015-03-13 11:19 363 查看
简要分析一下题目,就是总共多少个小朋友,从第一个小朋友开始报数,比如报到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;

}

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

个人感觉用链表解这个题目更加简单明了,许多变量,计数器啊也省去了不少!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: