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

在这里插入图片描述

为了加深对环形链表的理解和掌握,这两道题是很不错的选择。
这里所说环形链表不是一个圈圈的结构,而是带环链表。

链接:环形链表(1)

在这里插入图片描述
注意这里链表的长度
在这里插入图片描述
所以要注意链表是否为空
第一种方法,应该是比较容易想到的方法(偷鸡取脚)
 遍历链表,将每个节点的val更改为一个不容易想到的值,如666666,当遇到一个666666时就返回true,如果在遍历过程中一直走到空都再没有遇到一个666666,那就返回false。
代码如下

bool hasCycle(struct ListNode *head) {struct ListNode*p=head;while(p){if(p->val!=666666){p->val=666666;p=p->next;}else return true;}return false;
}

这种方法明显是投机取巧,所以还有可能被抓到。
运行后还是也可以通过
在这里插入图片描述
双指针法(正经方法)
 就想操场的跑道上,有跑的快的人和跑得慢的人,快的人会不断追上慢的人。
 设置双指针,从head开始走,快指针一次跑两步,慢指针一次跑一步,链表中是有环的,快指针一定会抓到慢指针。
 在慢指针进环时,快指针已经在环状里转圈圈了,慢指针一次走一步,快指针一次走两步,慢指针走半圈,快指针就走一圈。
在这里插入图片描述
代码如下

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

一直找找找,如果有环一定会相遇。
思考:

如果快指针一次走3步,还可以保证能抓到慢指针吗?

 假使慢指针进环时,快慢指针差距m个位置,每次快指针与慢指针的距离差距减小为2,有两种情况。

  1. m为偶数

每次距离都减小2
m-2
m-4
m-6

4
2
0
最终快指针会遇到慢指针。
2. m为奇数
m-2
m-4

3
1
-1
当相差为-1时,快慢指针间的距离变为了m-1。
假设C是环的长度,这里的-1即为C-1;如果环的长度为偶数,那么快慢指针最近的距离为1,因为一次减小的距离为2,所以永远也追不上慢指针。


环形链表(2)
在这里插入图片描述
和第一道题不一样的是这道题如果有环,就返回入环的第一个节点,如果链表无环,就返回NULL。
接下来就要进行分析
 当快指针与慢指针相遇时,快指针所走的路程是慢指针的两倍。
 假设起点到入环口的距离是L,圆环的长度为C,入口点到相遇点的距离为x,这时通过分析就可以列出一个等式。
在这里插入图片描述
快指针的路程是慢指针的二倍

2(L+X)=L+n( C )+X
可得
L+X=n( C )
L=n( C )-X;

设置两个指针,第一个指针从起始位置出发,另一个指针从相遇点出发,他们就会在环的入口处相遇。
套用第一道题的思路,快慢指针相遇时找到相遇点,在设置两个指针分别出发,直到相遇,如果没有环的话就返回NULL;
代码如下

    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(head!=meet){head=head->next;meet=meet->next;}return meet;}}return NULL; } 

提交后顺利通过。

环形链表的约瑟夫问题
链接:
环形链表的约瑟夫问题
在这里插入图片描述
要使用单向链表实现。
 分析题目,构建一个链表,依次储存节点的位置,然后找到链表的尾,尾的next等于头节点,这样一个环形链表就构建成功了。
 从第一个节点开始往后走m-1步(数数时为m,因为第一个节点数1,所以往后走m-1到达目标节点),保存这个节点的next,将起始位置更改为该next,然后从新的起始位置继续往后边数,直到删除到只剩最后一个节点为止,假设这个节点为hei,那么循环结束的条件就是hei->next==hei,判断条件就是hei->next!-hei。

要注意
看代码,讲解很详细

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef struct ListNode
{int val;struct ListNode* next;
}LN;LN* Initnode()
{LN* head = (LN*)malloc(sizeof(LN));head->next = NULL;head->val = 0;return head;
}LN* GetNewnode(int x)
{LN* newnode = (LN*)malloc(sizeof(LN));newnode->next = NULL;newnode->val = x;return newnode;
}
void Pushnode(LN* head, int x)
{assert(head);LN* pre = head;while (pre->next){pre = pre->next;}pre->next = GetNewnode(x);
}void Popnode(LN*head,LN* node)
{LN* cur = head;while (cur->next != node){cur = cur->next;找到要删除的节点的前一个}LN* next = node->next;cur->next = next;free(node);node = NULL;
}int main()
{int m, n;scanf("%d %d", &m, &n);//建立链表LN* head = GetNewnode(1);//第一个编号为1for (int i = 2; i <= m; i++){Pushnode(head, i);//建立链表}//找尾LN* cur = head;while (cur->next != NULL){cur = cur->next;}cur->next = head;//环形链表弄完//数数删位LN* hei = head;while (hei->next != hei){for (int i = 1; i < n; i++)//因为移动三步,是移动量两次。{hei = hei->next;}LN* pop = hei;//找到要删除的节点pophei = hei->next;//更换hei的位置Popnode(hei,pop);//删除pop。}printf("%d ", hei->val);//打印留下的节点的数值。return 0;
}

本文的讲解到这里就结束啦,鄙人才识短浅,如有错误还请多多指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Premiere、PhotoShop和Audition做视频特效

今天接到一个做视频的任务&#xff0c;给一个精忠报国的视频&#xff0c;要求&#xff1a;   ①去掉人声&#xff0c;就是将唱歌的人声去掉&#xff0c;只留下伴奏&#xff1b;   ②截图视频中的横幅&#xff0c;做一个展开的效果&#xff0c;类似卷纸慢慢展开&#xff1b;…

【LeetCode刷题(数据结构)】:二叉树的前序遍历

给你二叉树的根节点root 返回它节点值的前序遍历 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1] 示例…

【iOS】计算器仿写

文章目录 前言一、构建View界面二、Model中进行数据处理三、Controller层实现View与Model交互总结 前言 在前两周组内进行了计算器的仿写&#xff0c;计算器仿写主要用到了MVC框架的思想以及数据结构中用栈进行四则运算的思想&#xff0c;还有就是对OC中的字符串进行各种判错操…

【Java基础面试十二】、说一说你对面向对象的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 说一说你对面向对象的理…

C++前缀和算法:构造乘积矩阵

基础知识点 C算法&#xff1a;前缀和基础 题目 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元素 p[i][j] …

【LeetCode热题100】--75.颜色分类

75.颜色分类 方法一&#xff1a;使用单指针 class Solution {public void sortColors(int[] nums) {int n nums.length;int ptr 0;for(int i 0;i<n;i){if(nums[i] 0){int tmp nums[i];nums[i] nums[ptr];nums[ptr] tmp;ptr;}}for(int i ptr;i<n;i){if(nums[i] …

【Java基础面试十三】、面向对象的三大特征是什么?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;面向对象的三大特征是什…

MySQL单表查询基础综合练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 v…

Linux文件管理(上)

一、VIM编辑器 1、vi概述 vi&#xff08;visual editor&#xff09;编辑器通常被简称为vi&#xff0c;它是Linux和Unix系统上最基本的文本编辑器&#xff0c;类似于Windows 系统下的notepad&#xff08;记事本&#xff09;编辑器。 2、vim编辑器 Vim(Vi improved)是vi编辑器…

联邦学习+梯度+梯度剪枝

联邦学习需要参与者在每一次的本地训练后&#xff0c;上传所更新的模型参数并与其他参与者共享&#xff0c;而参数更新中仍有可能包含所有者的敏感信息 解决方案&#xff1a; 加密方法&#xff08;安全多方计算、同态加密&#xff09;通过将明文编码为密文的方式&#xff0c;…

基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

1数据结构的分类,算法效率的度量

一&#xff0c;数据结构的定义和分类 数据结构&#xff1a;数据之间的关系即数据的逻辑结构&#xff0c;因为要存储到计算机里&#xff0c;所以视为将这个数据的逻辑结构映射到存储器里。即数据因为自身的和其他的数据的关系而在计算机内存储的方式。我们就归类了一些类型。 二…

21-数据结构-内部排序-交换排序

简介&#xff1a;主要根据两个数据进行比较从而交换彼此位置&#xff0c;以此类推&#xff0c;交换完全部。主要有冒泡和快速排序两种。 目录 一、冒泡排序 1.1简介&#xff1a; 1.2代码&#xff1a; 二、快速排序 1.1简介&#xff1a; 1.2代码&#xff1a; 一、冒泡排序…

YOLO目标检测——安全帽手套数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;主要应用于监控视频中工作人员是否佩戴安全帽或手套的场景。数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;类别有&#xff1a;手套、头盔、非头盔、人、鞋、背心、赤膊&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用la…

The given SOAPAction http__xxxxx_xx does not match an operation

这是在客户端调用服务端接口时报出的错误&#xff0c;主要是客户端在调用时设置了SOAPAction&#xff0c;参考如下&#xff1a; 解决方案 在注解WebMethod() 中加上action注解&#xff0c;设置上一模一样的SOAPAction即可&#xff0c;如下&#xff1a; WebMethod(action &qu…

小程序设计基本微信小程序的旅游社系统

项目介绍 现今市面上有关于旅游信息管理的微信小程序还是比较少的&#xff0c;所以本课题想对如今这么多的旅游景区做一个收集和分类。这样可以给身边喜欢旅游的朋友更好地推荐分享适合去旅行的地方。 前端采用HTML架构&#xff0c;遵循HTMLss JavaScript的开发方式&#xff0…

【CANoe】TX Self-ACK自应答配置与CPAL实现

一、引言 在测试CAN&CANFD通信或者网络管理的时候&#xff0c;我们经常遇到使用报文&#xff08;网络管理报文或者通信报文&#xff09;唤醒被测件这个测试点&#xff0c;如果测试比较多的情况下&#xff0c;我们就会发现&#xff0c;如果CANoe没有接被测件或者被测件没有…

CSS 效果:多列文字,第一行对齐,flex方式元素被挤压

如图效果&#xff1a;2列&#xff0c;第一列只有一行&#xff0c;第二列多行。要求第一行对齐 实现&#xff1a;使用flex 如果不配置flex-shrink的话&#xff0c;第一列会被挤压 给第一列&#xff1a;备注配置压缩属性&#xff1a; flex-shrink&#xff1a;0。 <!DOCTYPE…

发现了一个牛逼的网站 可以免费使用chatGPT(看到最后)

最近,打工人们集体陷入了一场焦虑。“一觉醒来,我感觉自己快要失业了……”“身为文字工作者,我该如何自保饭碗?”“人工智能到底会不会完全取代人类的工作?” ChatGPT最近都听说了吧?据说,改论文、敲代码、写文案……只有你想不到的,没有人家办不成的! 它是什么? …

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)rust解法

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…