数据结构课堂老师布置了一道题目,就是传说中大名鼎鼎的约瑟夫问题,在此描述一遍:
有n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过k−2
个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k−1
个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了n和k
,一开始要站在什么地方才能避免被处决?--(来自维基大典)
题目提示得有点明显,圆圈-->循环链表,那么到底要怎样写循环链表呢,每个结点应该如何?需要哪些函数?
毫无疑问,先站成一个圈,那就是创建循环链表,越过k-1个人以后杀掉第k个人,那就得有删除结点的功能,然后,,也没啥特别的了,只要确定游戏终止规则——即循环结束的条件是还剩最后一人,把那个人的信息输出来就知道一开始应该在哪个位置能活命。
本文将围绕这个问题给出单双链表的解法,先用双向循环链表的思想,纯粹面向过程的方法,再用单向循环链表的方法面向过程地实现一遍,然后再把一些模块封装成函数,使程序模块化。
双向循环链表思想解法
// // Created by zhuge on 2018/3/11. // #include <iostream> using namespace s |