前言
今儿是大年初一,白天看完流浪地球这部科幻电影,号称中国科幻电影的一个里程碑。剧情紧凑,特性也不错很有质感。特别末日的的地下城生活片段。一个字棒。 晚上闲来无事单算研究下大话数据结构这部分,填补下数据结构这方面的弱点。
什么是循环链表
- 将单链表中终端结点的指针端自空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾:相接的单链表称为单循环链表,简称循环链表。
循环列表的生活情境
- 比出 ,你是一业务员, 家在上海。儒要经常出差,行程就是上海到北京一路上的 城市,找客户谈生意或分公司办理业务。你从上海出发,乘火车路经多个城市停留 后,再乘飞机返回上海,以后,每隔一段时间,你基本还要按照这样的行程开展业务
- 有一次你先到南京开会,接下来要对以上的城市走一遍。此时有人对你说,不行,你得从上海开始,因为上海是第一站。 你会对这人说什么?神经病。哪有这么傻 的,直接回上海根本没有必要,你可以从南京开始,下一站蚌埠,直到北京,之后再 考虑走完上海及苏南的几个城市。显然这表示你是从当中一结点开始遍历整个链裴 , 这都是原来的单链表结构解决不了的问题。
循环链袭和单链表的主要差异
- 循环链袭和单链表的主要差异就在于循环的判断条件土,原沫是判断
p->next(指针域)
是否为空,现在则是p-> next
不等于头结点,则循环未结束。 - 在单链表中,我们有了头结点时,我们可以用 0(1)的时间访问第一个结点,但对于要访问到最后一个结点,却需要 O(n)时间,因为我们需要将单链表全部扫描一编。
- 循环链表的尾指针方式就用0(1)的时间访问到尾部元素
代码实现
1 | public class CycleLinkList { |
1 | public class Node { |
约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 [1] 结果+1即为原问题的解
1 | public class Yuesefu { |
算法流程如下:
- 1.初始化循环链表,从下标1开始自增赋值。头结点单数据域默认为空。单独处理不存放值
- 2.赋值到最后totalCol-1的结点 也就是尾部结点。它的指针域指向头结点形成单向循环链表。
- 3.循序开始判断链表是不是只剩下一个节点。也就是结点的指针域是否指向头结点。如果是就直接退出while并自杀此结点
- 4.当结点的指针域不是指向头结点时。循环操作i<k-1次循环找到当前报数为3的前一个节点。并使头结点替换
- 5 用一个临时节点代替为当前报数为3的结点(也就是步骤4找的结点的next指向)输出它已自杀
- 6.使头结点的指针域指向报数为3的结点的next指向的结点。最后替换头结点等于当前报数为3的人结点 循环以上步骤直到最后一个结点自杀完毕