让你更好的了解链表-链表解决猴子,小朋友报数问题
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;
}
小小分析下,链表的好处,大家也知道,对于删除一个元素来的非常之快,非常之简便,所以当删除的时候,把该要被删除的孩子的左手边的孩子的右手,牵住要被删除的孩子的右手边的左手,那么久牵手成功,哈哈,是不是有点绕啊!
个人感觉用链表解这个题目更加简单明了,许多变量,计数器啊也省去了不少!
关于这个题目的逻辑关系就是线性关系,而像这种线性关系一般都是相对非线性关系比较好解,这个题目在网上也有多种多样的解法,比如静态数组解法,动态数组解法,约瑟夫环等等,由于是线性关系,所以楼楼想到链表也是可以解的,解法就是循环链表,个人感觉,除了约瑟夫环,和别的解法效率差不多,但是好处就是数据对题目的立体化,个性化,以及层次化!
代码如下:
#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;
}
小小分析下,链表的好处,大家也知道,对于删除一个元素来的非常之快,非常之简便,所以当删除的时候,把该要被删除的孩子的左手边的孩子的右手,牵住要被删除的孩子的右手边的左手,那么久牵手成功,哈哈,是不是有点绕啊!
个人感觉用链表解这个题目更加简单明了,许多变量,计数器啊也省去了不少!
相关文章推荐
- 借助链表解决猴子选大王问题(约瑟夫环问题)
- 链表解决约瑟夫环类似的猴子问题
- 了解和解决 SQL Server 7.0 或 2000 阻塞问题
- 用个循环链表解决约瑟夫环问题
- 用Struts2更好的实现文件的上传、下载功能以及解决中文名称问题
- 用上节的循环双向链表解决vigenere加密问题。
- 使用C#循环链表解决约瑟夫环的问题
- 用python编写ASP脚本时遇到的问题,初步的解决方法,目前正在寻找更好的解决办法。
- ruby解决猴子大王问题
- ruby解决猴子大王问题
- C#.Net里面通过事件调用事件,通过简单了解相信可以帮你解决问题
- iPhone OS 开发 - 了解并解决代码签名问题
- 约瑟夫问题链表解决方法(带有析构函数)
- 了解和解决SQL Server 7.0 或2000 阻塞问题
- JBuilder2005光标问题更好的解决方法
- 循环双向链表 及 约瑟夫问题的解决
- 猴子报数问题(java实现)
- iPhone OS 开发-了解并解决代码签名问题
- 真正的创新必然是基于对市场的了解,对客户反馈的观察,开发出来的产品一定要适应市场,提出的模式一定要能解决现实的问题。而在这其中,技术只是一种实现手段。
- 循环链表解决约瑟夫问题