环形链表问题

「Java 数据结构」:环形链表和约瑟夫问题。 first是指向链表的第一个的,但我们开始的位置可以是任何一个结点,所以先声明辅助结点temp,遍历循环链表,如果结点的data和传入的start的值相等,就找到了开始位置,将first指向开始位置temp,然后循环就结束了。显示循环链表的方式和单链表的显示方式差不多,关键点在于如何判断循环链表的结束,我们的尾部是指向头部的,所以当尾部的next指向的结点等于头部,就是最后一个结点,此时就退出循环。first继续指向要出圈数据的下一个结点,end所在的结点指向first指向的结点,就让数据3出圈了。.... 阅读详情

1.链表中是否存在环形结构

首先这种题目我们要想到两个快慢指针

struct ListNode *fast 和 struct ListNode *slow

两个指针都指向头节点开始往后走

fast一次走两步

slow一次走一步

如果链表中有环那么这两个指针将会相遇

代码如下

bool hasCycle(struct ListNode *head) {
    struct ListNode*quick=head;
    struct ListNode*slow=head;
    while(quick&&quick->next)
    {
        quick=quick->next->next;
        slow=slow->next;
        if(slow==quick)
        {
            return true;
        }
    }
    return false;
}

2.链表中是否存在环形结构并且返回开始入环时第一个节点

首先!!!!!这是一个需要计算的题目

只有通过计算我们才能得出思路!!!!!

让我们看上面那个图像

假设非环形链表长L

环形链表长C

快慢指针fast和slow相遇点是meet

入环节点和meet相距N

我们知道快指针fast走的路程是slow的两倍 假设fast比slow多走了n圈

所以可以得出等式 L+N+n*C=2*(L+N) =>> L+N+(n-1)*C+C=2*(L+N)

解等式两边得 C=L+N 

转换得C-N=L

所以我们可以在fast和slow相遇位置设置一个节点meet

meet和head同时从当前位置移动每次走一步

当meet和head相遇时所在节点为进入环的节点

代码如下

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    while(fast && fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(slow==fast)
        {
            struct ListNode * meet=slow;
            while(meet!=head)
            {
                meet=meet->next;
                head=head->next;
            }
            return head;
        }
    }
    return NULL;
}

约瑟夫问题——环形链表实现 1. 约瑟夫问题 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 2. 思路分析 采用环形链表的方式,该链表中存储first结点与cur结点,分别表示第一个人与最后一个人,其中cur.next = first,即最后一个人指向第一个人。 采取循环的方式进行,设置计数器times... 阅读详情

相关推荐

离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法1.重数:两点之间的平行边的个数1.得到 n!的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最后一个为1,所有可能的结果就等于 n * (n - 1) *(n - 2)*....*1 = n!2.虽然说找对应结点很困难,但不是没有规律可循的。比如1.两个相互对应的结点的度数要相同;

qq_51947882的博客 7443

环形链表的约瑟夫问题

环形链表的约瑟夫问题

大学成长道路上的探索经历与点滴思考,与君共勉,共筑成长。 1013

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 381

【数据结构与算法 5】环形链表解决约瑟夫问题

目录 循环链表 分类 名称 无情 大风歌 asdf asdfasdf按时 阿斯蒂芬 asdf

学Java,找哪吒 4740

Linux SMP系统多核启动机制详解

对称多处理(SMP)是现代操作系统支持多核并行计算的基础架构。其核心原理是通过引导处理器(BSP)初始化系统环境后,通过处理器间中断(IPI)机制唤醒应用处理器(AP)。在x86架构中,AP启动时处于实模式,需要特殊的trampoline代码完成保护模式切换和分页设置。这种设计既保证了系统初始化的正确性,又实现了多核并行处理的性能优势。理解SMP启动流程对优化系统启动速度和调试多核问题至关重要,特别是在云计算和嵌入式系统中,高效的SMP初始化能显著提升系统响应能力。本文以Linux内核为例,深入解析了从BS

weixin_35006125的博客 291

Stateflow使用C语言结构体,关于使用Stateflow调用外部C代码的教程介绍

无论是Simulink仿真,还是对模型做代码生成,已有C代码的调用都是我们经常会遇到的情形:如何调用现有的外部C代码?很多人首先想到的是S-Function。的确,S-Function提供了一种途径,可以让我们把C函数封装成Simulink模块在Simulink环境下运行。另外还有一种方式,叫做Legacy Code Tool,说白了也是S-Function,只是MATLAB提供了这样的接口便于用...

weixin_34947914的博客 2673

力扣环形链表(1)进阶环形链表(2)及环形链表的约瑟夫问题

题目详细解析

qq_75270497的博客 831

使用TMS320F28335控制四位共阳数码管

简要阐述利用F28335控制四位共阳数码管的整个过程,包括原理、思路、部分代码以及调试过程。

liujunhaozuishuai的博客 2660

【数据结构与算法】环形链表的约瑟夫问题

据说著名犹太 Josephus有过以下的故事:在罗⻢⼈占领乔塔帕特后,39个犹太⼈与Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被⼈抓到,于是决定了⼀个⾃杀 ⽅式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3⼈该⼈就必须⾃杀,然后再由下⼀ 个重新报数,直到所有⼈都⾃杀⾝亡为⽌。历史学家 然⽽Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与⾃⼰安排在 第16个与第31个位置,于是逃过了这场死亡游戏。编辑。

weixin_43932886的博客 1050

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6560

环形链表以及约瑟夫问题

环形链表以及约瑟夫问题问题描述 问题描述 编号为1,2,3,4,5,6,7…n的n个人围着坐一圈,约定编号为k(1<= k <= n)的人从1开始报数,数到m的那个人又出列,以此类推,直到所有人都出列为止,由此产生一个出队编号的序列。 举例说明: n = 5,即有5个人 k= 1, 从第一个人开始报数 m = 2, 数两下 例子的出队列的情况: 1,2,3,4,5 1,3,4,5 1,3,5 3,5 3 package linkedList; public class Josepfu {

qq_25355771的博客 689

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3696

5. 环形链表实现约瑟夫问题

一、概念 1. 环形链表 环形链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向第一个结点,整个链表形成一个环。 2. 约瑟夫问题 设编号为1,2,…,n 的n个人围坐一圈,约定编号为 k (1 ≤ k ≤ n) 的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人都出列为止,由此产生一个出队编号的队列。 二、环形链表...

banmingi的博客 294

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

环形链表,joseph问题

重点:头指针 first & 尾指针 cut 思路: 1、先创建第一个节点,让 first 指向该节点,并形成环状 2、后面每创建一个新节点,就把该节点加入到已有的环形链表中 遍历: 1、先用辅助指针指向 first 节点 2、然后通过 while 循环遍历,终止条件: cut.next = first 节点类: // 节点类 class children{ int id; child...

m0_46826496的博客 324

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

环形链表解释约瑟夫问题

单向链表、双向链表和环形链表都是常见的链表数据结构,它们在不同场景下具有不同的特点和优缺点。

IT小辉同学 1114

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

利用环形链表解决约瑟夫环问题

用环形链表解决约瑟夫环的问题 设编号为1,2,3,...,num的num个人坐成一圈,约定编号为start(1<=start<=num)的人从1开始报数,数到count的那个人出列,它的下一位又开始从1报数,数到count的人又出列,以此类推,直到所有人出列位置,由此 产生一个出队编号的序列 假设有5个人(num=5),编号为1的人从1开始报数(start=1),数到5的人出列(count=2)。 首先,写一个实体类用来表示人。 class Child { private int no;

fj_xiang的博客 453

环形链表【约瑟夫问题】

1、环形链表的创建 构建环形链表思路: 1.先创建第一个第一个结点,并形成环形 2. 后面当我们每创建一个新的结点,就把该结点加入到已有的环形链表中即可 遍历环形链表: 先让一个辅助指针【变量】curBoy,指向first结点 然后通过一个while循环遍历该环形链表即可 curBoy.next == first结束 2、约瑟夫问题 约瑟夫问题:环形链表出圈顺序 思路: 1.需要创建一个辅助变量helper,事先指向环形链表的最后这个结点(始终与cur当前结点 2.当小孩报数时,让cur和help

weixin_41974036的博客 234

约瑟夫问题的环形链表实现[Java]

一个古老而有趣的数学问题:约瑟夫问题(Josephus Problem)

逐梦苍穹的博客 1167

力扣——环形链表问题

判断环形链表是否带环以及寻找环形链表入环的节点

2301_80309505的博客 996

环形链表之约瑟夫问题

约瑟夫问题是相对复杂的环形链表问题,但也是相当经典的环形链表的应用。提示:以下是本篇文章正文内容,下面案例可供参考。

logohjiji的博客 647

环形链表解决约瑟夫问题

一.问题描述 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,...

或无言的博客 342

环形链表问题的探究与代码实现

环形链表问题是算法学习中的一个重要知识点。通过快慢指针法,我们可以高效地判断链表是否有环以及找到环的入口点。理解这个问题不仅有助于加深对链表数据结构的认识,还能提升逻辑思维和算法设计能力。在实际应用中,类似的思路也可以用于解决一些与循环、追踪路径相关的问题。

nplplus的博客 1146
上一篇: c语言冒泡排序法
下一篇: 栈:括号匹配问题
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值