关于约瑟夫问题(尾指针尾插法)
约瑟夫问题折腾了很久,还询问了别人,最后终于自己敲出了一个自认为完美的解决方案。
虽然我一开始写的代码可以输出结果,但是可能是因为时间超限,原本可能是rear指针移动的原因,直接反映到析构上,这样也好。长见识了,以后如果析构出问题了,就要检查一下指针的相关移动。
难点在于仅用尾指针将结点插在尾部,不用头结点和头指针。
现在这个难点解决了!实际上所有的难点都是建立在基础上的,就像插入节点时需要先将下一个节点的地址保存一样,循环链表中的头结点也没什么不同,不过是每次插入时都要现将头结点的地址赋给新节点的next域。而头结点的地址始终保存在rear指针指向的结点的next域中,所以重中之重是每次一定要移动尾指针以确保尾指针的位置正确。
题目描述:约瑟夫(Joseff)问题求解。n个人围成一圈,编号依次为1, 2....n,从第一个人开始报数,m号出圈,再从下一个开始报数m号出圈,直至所有人出圈。求出圈的次序。要求采用仅设尾指针的单向循环链表实现。已知类的定义、部分成员函数及主函数代码如下(勿改动)。
如下是插入函数的代码:
template <class T>
void LinkList<T>::RInsert(T x)
{Node<T>* p;p = new Node<T>;//分配空间p->data = x;if (rear == NULL){rear = p;p->next = rear;}else{p->next = rear->next;rear->next = p;rear = rear->next;}
}
以下是约瑟夫代码:
template <class T>
void LinkList<T>::Joseff(int m)
{Node<T>* p;if (rear){p = rear->next;for (int i = 1; p->next != p; i++, p = p->next){if (i == m-1 ){Node<T>* q = p->next;p->next = q->next;cout << q->data << " ";i = 0;}}cout << p->data;}rear = NULL;
}
没想到这道约瑟夫的重点却是尾结点尾插法。
不过这种约瑟夫的写法也是简洁明了。
关于约瑟夫问题(尾指针尾插法)相关推荐
- C语言的双向链表头插法和尾插法,指定节点删除
文章目录 前言 头插法 尾插法 删除节点 测试代码如下 前言 双向链表和单链表的唯一区别就是多个一个指针域而已,该指针域可以访问链表的上一个节点. 关于构造双向链表的过程我们常见的有两种方法,和单链表 ...
- C语言的单链表创建:头插法/尾插法
文章目录 前言 链表头插法 链表尾插法 源码实现 前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了. 链表数据 ...
- 单链表-单链表拆分为A和B链表(尾插法+头插法)
题意: 设C{a1,b1,a2.b2-an,bn}为一线性表,采用带头结点的单链表hc存放,设计一个就地算法,将其拆分为两个线性表,每个线性表均采用带头结点的单链表存储,使得: A = {a1,a2. ...
- 建立循环单链表(尾插法)
循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...
- 建立双链表(尾插法)
双链表存储结构: 要建立双链表,首先要明白双链表的存储结构定义: typedef struct DLinkList{ //存储结构定义int data;DLinkList * prior;DLinkL ...
- 建立单链表(尾插法)
建立单链表有两种方法, 这里采用头插法. 尾插法含义: 该方法是从一个空表开始,读取数组的元素,生成新节点,将读取的数据放到存放在新节点的数据域中,然后将该节点插入到链表的表头上,直到结束为止. 由于 ...
- 数据结构之单链表尾插法创建-RearCreate
/* 单链表整表创建算法思路 1.声明一结点p和计数器变量i 2.初始化一空链表L 3.让L的头结点的指针指向NULL,即建立一个带头结点的单链表 4.循环: 生成一新结点赋值给p 随机生成一数字赋值 ...
- C语言-链表的创建头插法和尾插法(有无头节点)
文章目录 结构声明 1 头插法(有头节点) 2 头插法(无头节点) 3 尾插法(有头节点) 4 尾插法(无头节点) 结构声明 typedef int ElementType;typedef struc ...
- 数据结构—分别用头插法和尾插法建立单链表
#include <iostream> using namespace std; typedef struct LNode{int data;struct LNode *next; }LN ...
最新文章
- 第四周实践项目4 建立算法库——双链表
- NSArray打印汉字的方法
- 【Unity3D与23种设计模式】中介者模式(Mediator)
- python的scikit-learn算法库实现
- python 异常回溯_关于python:在循环中捕获异常回溯,然后在脚本末尾引发错误...
- 利用专用文件夹隐藏文件 (tasks、fonts)
- 11 如何通过 “副本传输” 传输从DEV到QAS的请求号
- for (;;) 与 while (true),哪个更快?
- 计算机数据库相关法规,法律法规数据库-详细页
- 西门子PLC200SMART(二)
- 新版掌上阅读小说源码+支持公众号/分站/封装APP
- hell脚本分享:DebianLNMP一键安装服务器套件
- eNews 第二十六期/2007.07
- 【QT 5 学习笔记-学习绘图相关+画线图形等+绘图事件+基础学习(1)】
- html制作简单框架网页 实现自己的音乐驿站 操作步骤及源文件下载 (播放功能限mp3文件)
- SpringBoot集成微信支付V3
- c++ socket 多线程 网络聊天室
- 《Hexo: 从零开始编写自己的主题》1. Hexo概述以及Hexo工作原理
- c++生成DLL文件(visual studio 2019)面向小白萌新
- 1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛