环形链表(快慢指针)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

 

#include <stdbool.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

bool hasCycle(struct ListNode *head) {
    if (!head || !head->next) {
        return false; // 链表为空或只有一个节点,肯定没有环
    }

    struct ListNode *slow = head;
    struct ListNode *fast = head->next;

    while (slow != fast) {
        if (!fast || !fast->next) {
            return false; // 如果快指针或快指针的下一个节点为NULL,说明没有环
        }
        slow = slow->next;
        fast = fast->next->next;
    }

    return true; // 如果能跳出循环,说明有环
}

 这里同样使用了快慢指针的方法,注意在C语言中要使用 struct 来定义链表节点。算法思想和Python版本相同,只是语法有所不同。

 如果你想测试上述 C 代码,可以创建一个简单的链表,并手动设置环。以下是一个例子:

#include <stdio.h>
#include <stdbool.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

bool hasCycle(struct ListNode *head);

int main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(与节点3相同,形成环)
    struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
    head->val = 1;

    struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node2->val = 2;
    head->next = node2;

    struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node3->val = 3;
    node2->next = node3;

    struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node4->val = 4;
    node3->next = node4;

    struct ListNode *node5 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node5->val = 5;
    node4->next = node5;

    // 设置环
    node5->next = node2;

    // 测试是否有环
    if (hasCycle(head)) {
        printf("链表中存在环。\n");
    } else {
        printf("链表中不存在环。\n");
    }

    // 释放节点内存
    free(head);
    free(node2);
    free(node3);
    free(node4);
    free(node5);

    return 0;
}

在这个例子中,我们手动创建了一个包含五个节点的链表,并设置第五个节点指向第二个节点,形成了一个环。当运行程序时,输出应该是 "链表中存在环"。 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LINE官方账号全攻略:设置流程与基本功能

LINE官方账号是专为企业和品牌而设计&#xff0c;提供了更多的商业功能和定制选项。在中国台湾、日本和东南亚这些地区&#xff0c;LINE相比其他社交媒体软件具有更大的用户群体和更广泛的影响力&#xff0c;尤其在台湾和泰国地区&#xff0c;有90%的人都在使用LINE。而且LINE官…

1Panel应用推荐:青龙定时任务管理平台

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

769933-15-5,Biotin aniline,可以合成多种有机化合物和聚合物

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;生物素-苯胺 一、基本信息 产品简介&#xff1a;Biotin Aniline&#xff0c;一种具有重要生物学功能的化合物&#xff0c;不仅参与了维生…

PHP入门指南:进阶篇

PHP入门指南&#xff1a;进阶篇 PHP入门指南&#xff1a;进阶篇1. 面向对象编程&#xff08;OOP&#xff09;1.1 类和对象的基本概念1.2 构造函数和析构函数1.3 属性和方法的访问控制1.4 继承与多态 2. 错误和异常处理2.1 错误处理机制2.2 异常处理机制2.3 自定义异常类 3. PHP…

免费ai绘画软件选择哪个?

对于免费AI绘画软件的选择&#xff0c;因为每个软件都有其独特的优点和适用场景&#xff0c;可以根据个人的需求和技能水平来决定。以下是被广泛认可的AI绘画软件&#xff1a; 1、建e网AI-一款为建筑室内设计师提供AI绘图的智能工具&#xff0c;具有文字生图&#xff0c;方案优…

Pytroch 自写训练模板适合入门版 包含十五种经典的自己复现的一维模型 1D CNN

训练模板 在毕业之前&#xff0c;决定整理一下手头的代码&#xff0c;自己做1D-CNN这吗久&#xff0c;打算开源一下自己使用的1D-CNN的代码&#xff0c;包括用随机数生成一个模拟的数据集&#xff0c;到自己写的一个比较好的适合入门的基础训练模板&#xff0c;以及自己复现的…

松软香甜的贝果面包,碱水清香可口饱腹

最近尝试了一款碱趣贝果面包&#xff0c;是手工制作的美味面包&#xff0c;它非常蓬松&#xff0c;口感熟软&#xff0c;而且食用方便快捷&#xff0c;只需加热一下就可以食用。 这款面包的表皮清香有韧性&#xff0c;里面松软可口&#xff0c;加热后散发出清新的香气&#xff…

负载均衡下webshell连接

目录 一、什么是负载均衡 分类 负载均衡算法 分类介绍 分类 均衡技术 主要应用 安装docker-compose 2.1上传的文件丢失 2.2 命令执行时的漂移 2.3 大工具投放失败 2.4 内网穿透工具失效 3.一些解决方案 总结 一、什么是负载均衡 负载均衡&#xff08;Load Balanc…

51单片机编程应用(C语言):矩阵键盘

16个按键只要8个I/O口&#xff0c;本来16个按键要16个I/O口。 矩阵键盘可以按行扫描也可以按列扫描&#xff0c;扫描原理很简单&#xff0c;变成之前的独立按键&#xff0c;比如 按行扫描&#xff0c;看原理图如下&#xff0c;我们P170,另外三个置1&#xff0c;那么第一行就选…

手写RPC框架

RPC框架核心组件 对于RPC框架简洁模式下&#xff0c;主要有以下角色&#xff0c;暂且抛开心跳机制以及负载均衡等复杂策略&#xff0c;我们先来自己实现一个RPC框架&#xff0c;后面我们再深入理解。 注册中心 RegisterServiceVo package com.cover.rpc.remote.vo;import …

J6 - ResNeXt50模型的实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境代码在之前的章节都有&#xff0c;我后续只贴出模型设计构建过程如下打印模型结构打印参数量 训练过程与结果总结 环境 系统: L…

聊聊并发编程,另送5本Golang并发编程新书

大家好&#xff0c;我是飞哥&#xff01; 并发编程并不是一个新话题&#xff0c;但是我觉得在近几年以及未来的时间里&#xff0c;并发编程将显得越来越重要。 为什么这样讲&#xff0c;让我们先回到一个基本的问题上来&#xff0c;为什么我们要采用并发编程&#xff1f;关于这…

数据分析基础之《pandas(2)—基本数据操作》

一、读取一个真实的股票数据 1、读取数据 # 基本数据操作 data pd.read_csv("./stock_day.csv")data# 删除一些列&#xff0c;使数据简洁点 data data.drop([ma5,ma10,ma20,v_ma5,v_ma10,v_ma20], axis1)data 二、索引操作 1、numpy当中我们已经讲过使用索引选取…

Unity 读取指定目录所占内存大小

public static class TxxTool{#region 读取文件大小private static List<string> DirList new List<string>();public static long GetFileSize(string path){DirList new List<string>();DirList.Add(path);GetAllDirecotries(path);long fileSize 0;for…

蓝桥杯省赛无忧 课件87 01tire

01 算法概述 02 问题引入 03 算法分析 04 例题

ReactNative实现的横向滑动条

OK,我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok,我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from react-native-linear-grad…

开源软件:技术创新与应用的推动力量

文章目录 每日一句正能量前言开源软件如何推动技术创新开源软件的历史开源软件的开发模式开源软件与闭源软件源代码和开发许可维护特点、支持和成本开源软件的优势减少开支可定制性快速创新发展透明度和安全性 开源软件的应用 常见问题后记 每日一句正能量 不好等待运气降临&am…

vue3-自定义指令

自定义指令 vue 除了内置的制指令&#xff08;v-model v-show 等&#xff09;之外&#xff0c;还允许我们注册自定义的指令。 vue 复用代码的方式&#xff1a; 组件&#xff1a;主要是构建模块。 组合式函数&#xff1a;侧重有状态的逻辑。 自定义指令&#xff1a;主要是为…

大模型ReAct提示工程详解【2023】

普林斯顿大学的教授和谷歌的研究人员最近发表了一篇论文&#xff0c;描述了一种新颖的提示工程方法&#xff0c;该方法使大型语言模型&#xff08;例如 ChatGPT&#xff09;能够在模拟环境中智能地推理和行动。 这种 ReAct 方法模仿了人类在现实世界中的运作方式&#xff0c;即…

欧洲的编程语言三巨头,只剩下一位了!

能把三位大牛的名字都叫出来的人恐怕不多吧&#xff1a; 这三位都是图灵奖获得者&#xff0c;他们的名字和发明散布在各种教科书中&#xff0c;从左到右&#xff0c;依次是&#xff1a; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中…