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

news2025/7/19 6:24:18

在这里插入图片描述

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

链接:环形链表(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);//第一个编号为1
	for (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;//找到要删除的节点pop
		hei = hei->next;//更换hei的位置
		Popnode(hei,pop);//删除pop。
	}
	printf("%d ", hei->val);//打印留下的节点的数值。
	return 0;
}

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

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

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

相关文章

竞赛选题 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

影响多用户商城系统价格的因素有哪些?

多用户商城系统作为电商行业不可或缺的重要工具&#xff0c;其价格是众多商家关注的焦点。下面就影响多用户商城系统价格的因素有哪些作一些简单的介绍&#xff0c;希望对大家有所帮助(仅供参考)。 一、系统规模和功能 多用户商城系统的价格首先由其规模和功能决定。规模包括用…

如何使用RockPlus MES系统帮助SMT行业实现降本增效

SMT&#xff08;Surface Mount Technology&#xff09;是现代电子行业中主要的组装技术&#xff0c;广泛应用于电子产品的生产。SMT工艺涵盖了锡膏印刷、元器件贴装和回流焊接。经过这些关键工序&#xff0c;元器件被精确固定在电路板上&#xff0c;完成一个电子产品组装。 SM…

Java并发面试题:(五)volatile关键字

volatile 是什么 一旦一个共享变量&#xff08;类的成员变量、类的静态成员变量&#xff09;被volatile修饰之后&#xff0c;那么就具备了两层语义&#xff1a; 1&#xff09;保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c…

网工内推 | 南天软件,base北京,需持有CCIE认证,最高25k

01 北京南天软件有限公司 招聘岗位&#xff1a;IPT运维工程师 职责描述&#xff1a; 负责客户Cisco语音网络IPT ,CUCM的日常运维&#xff0c;扩容和项目支持&#xff0c;支持路由交换&#xff0c;无线等项目&#xff0c;实施工作以及相关实施文档。 任职要求&#xff1a; 1、…

css 特别样式记录

一、 这段代码神奇的地方在于&#xff0c; 本来容器的宽度只有1200px&#xff0c;如果不给img赋予宽度100%&#xff0c;那么图片 会超出盒子&#xff0c;如果给了img赋予了宽度100%&#xff0c;多个图片会根据自己图片大小的比例&#xff0c;去分完那1200px&#xff0c;如图二。…

【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] …

Linux:mongodb数据逻辑备份与恢复(3.4.5版本)

我在数据库aaa的里创建了一个名为tarro的集合&#xff0c;其中有三条数据 备份语法 mongodump –h server_ip –d database_name –o dbdirectory 恢复语法 mongorestore -d database_name --dirdbdirectory 备份 现在我要将aaa.tarro进行备份 mongodump --host 192.168.254…

剑指Offer || 038.每日温度

题目 请根据每日 气温 列表 temperatures &#xff0c;重新生成一个列表&#xff0c;要求其对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入: temperatures…

Dubbo服务发布与消费过程概述

Dubbo服务发布与消费过程概述如下所示&#xff1a; &#xff08;1&#xff09;Dubbo服务发布 ServiceConfig引用服务提供类并通过ProxyFactory 生成invoker&#xff1b; 然后通过Protocol 将invoker转为Exporter&#xff0c;在这个过程中会先启动Netty Server监听服务连接&am…

什么是NetApp的DQP和如何安装DQP?

首先看看什么是DQP&#xff0c;DQPDisk Qualification Package&#xff0c;文字翻译就是磁盘验证包。按照NetApp的最佳实践&#xff0c;要定期升级DQP包&#xff0c;保证对最新磁盘和磁盘扩展柜的兼容。 本文主要介绍7-mode下如何升级DQP&#xff0c;至于cluster mode另外文章…

【微信小程序】无纸化会议OA系统之首页搭建

前言 中国政府意识到信息技术的重要性&#xff0c;并开始积极推动信息产业的发展。一系列政策和措施被制定和执行&#xff0c;以促进信息技术的采用和普及&#xff0c;从而推动数字化时代的到来。为了响应国家推行的数字化时代&#xff0c;本篇文章以会议OA系统为背景进行编写…

二叉树与递归的相爱相杀

数据结构之二叉树 一、基于二叉树的基础操作1.二叉树的构建2.二叉树的遍历①前序遍历&#xff08;深度遍历&#xff09;②中序遍历③后序遍历④层序遍历判断一棵二叉树是否是完全二叉树&#xff08;基于层序遍历的思想&#xff09; 3.二叉树的数量问题①求二叉树结点个数②求二…

香港高才通通过后要做什么?- 2 缴费

今天缴费系统已经可以使用&#xff0c;登录缴费一下 打开从邮箱下载的确认邮件 打开文件中提供的【入境处网站】链接 单击【缴费和领取电子签证】&#xff0c;单击链接【线上付款】 在付款页面单击【电子签证&#xff0c;线上付款】 单击【开始】 输入档案编号&#xff0c…

解决方案:VSCode中配置自动格式化实现Ctrl+S自动格式化代码

目录 问题描述解决方案 问题描述 一致的代码风格不仅仅有助于提高可读性&#xff0c;还可以减少错误和漏洞的产生。在编码中&#xff0c;在VSCode中配置Prettier插件并实现使用CtrlS自动格式化代码&#xff0c;其可以&#xff1a; 根据事先定义的规则自动调整代码的缩进、换行…

微信小程序开发之会议oa(首页搭建)

前言&#xff1a; 上一篇我们掌握了关于小程序的框架&#xff0c;这篇博客带你完成小程序版的会议OA首页。效果如下&#xff1a; 一&#xff0c; 1.1先创建OA首页页面&#xff1a; 首先我们先建一个新项目&#xff0c;在app.json中编写代码 {"pages": ["pages/…

【数组的使用】

文章目录 前言数组的格式有两种数组是引用数据类型遍历数组获取数组的长度&#xff1a;数组名.length数组之间的引用数组中的null关于引用的注意事项总结 前言 数组的格式有两种 int[] array{1,2,3,4};int[] array2new int[10];//默认将数组进行初始化&#xff0c;里面的值都为…

项目管理软件排行榜:点赞榜TOP5揭晓!

通过项目管理软件企业可以快速、高效地管理项目、整合团队成员以及资源。现如今市场上各类项目管理软件层出不穷&#xff0c;因此选择一款适合自身企业需求的软件显得尤为重要。本文将为大家介绍项目管理软件排行榜点赞榜&#xff0c;为大家选购提供一些参考。 1.Zoho Project…

无声的世界,精神科用药并结合临床的一些分析及笔记(九)

住院计划表 她宫颈癌的手术决定在中心妇产医院进行&#xff0c;由于她抑郁症的爆发&#xff0c;也需要在安定医院调理&#xff0c;我决定制定一个住院计划&#xff0c;征求她和大夫的同意&#xff1a; 节点1&#xff1a;在安定医院治疗抑郁症&#xff0c;调整心理状态&#x…

vue基础知识十六:Vue.observable你有了解过吗?说说看

一、Observable 是什么 Observable 翻译过来我们可以理解成可观察的 我们先来看一下其在Vue中的定义 Vue.observable&#xff0c;让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 返回的对象可以直接用于渲染函数和计算属性内&#xff0c;并且会在发生变…