【小浩算法cpp题解】判断环形链表

news2024/12/28 3:15:08

目录

  • 前言
  • 我的思路
    • 思路一 (哈希表记录链表的访问):
    • 思路二 (双指针,快指针在前,慢指针在后):
  • 我的代码
    • 运行结果

前言

前几天我写的代码,都是把所有的内容写在main函数里,没有体现CPP面向对象的特性,我感觉很不好,所以接下来我的代码都会设计类,把不同的功能封装在类的成员函数里面。

我的思路

思路一 (哈希表记录链表的访问):

其实我最开始的思路就是设置一个visit数组,大小为100,但是这里需要链表里面存储的data是不超过99的,这样我就能通过visit[Lnode->data]O(1)的时间复杂度里面快速判断这个数组有没有被访问过。如果遍历到一个被访问过的结点,那就说明这个链表有环

思路二 (双指针,快指针在前,慢指针在后):

这个思路最开始我没想到,参考了教程。其实原理就在于:

设想有两个人在操场上面跑步,一个人跑的比另外一个人快,那么最后快的肯定能追上慢的,这个时候快的已经比慢的领先一圈了。

我们考虑用双指针来实现,一个指针一步一步的走,一个指针两步两步的走。最后如果这两个指针能重合,那么就说明有环。
值得注意的是,这里的判断条件稍微有点复杂,null->next,cpp是会报错的

  • 为什么要这样设置?
  • 看这里 小浩算法–题解–环形链表

我的代码

#include<iostream>
#include <unordered_map>
using namespace std;

typedef struct Lnode {
	int data;
	struct Lnode* next;
	Lnode(int val) :
		data(val), next(NULL) {
	}
};

class LinkedList {
private:
	Lnode* head;
	Lnode* rear;
	int node_num;

public:
	LinkedList() : head(nullptr),rear(head) {
		cout << "请输入链表的结点总数" << endl;
		cin >> this->node_num;
		int nodeData;
		//把链表的总长度存储在头结点的数据域
		head = new Lnode(node_num);
		Lnode* p = head;
		Lnode* q;
		for (int i = 0; i < node_num; i++) {
			cin >> nodeData;
			q = new Lnode(nodeData);
			p->next = q;
			p = p->next;
		}
		p = head->next;
		//输出生成的链表
		cout << "您已经生成如下链表: " << endl;
		while (p->next != NULL) {
			cout << p->data << " -> ";
			p = p->next;
		}
		cout << p->data<<endl;
		rear = p;
	}

	~LinkedList() {
		Lnode* current = head;
		while (current != rear->next && current != nullptr) {
			Lnode* next = current->next;
			delete current;
			current = next;
		}
	}

	void append(int val) {
		rear->next = new Lnode(val);
		rear = rear->next;
	}

	void generateRing(int x) {
		Lnode* ring_place = head;
		while (x-- != 0) {
			ring_place = ring_place->next;
		}
		rear->next = ring_place;
	}

	void print_ring_des() {
		cout << "环的终点是:" << rear->next->data << endl;
	}

	//根据哈希表来判断是否是个环
	void check_Ring() {
		Lnode* p = head;
		unordered_map<Lnode*, int> m;
		while (p != nullptr) {
			// 如果当前节点已存在于map中,则表示存在环
			if (m.find(p) != m.end()) {
				cout << "========哈希表结果:================" << endl;
				cout << "链表存在环!" << endl;
				return;
			}
			// 将当前节点加入map
			m[p] = 1;
			p = p->next;
		}
		// 遍历结束,未发现环
		cout << "========哈希表结果:================" << endl;
		cout << "链表不存在环!" << endl;
	}

	/// <summary>
	/// 利用双指针跑圈来判断是否有环,一个跑慢点(每次遍历1一个),一个跑快点(每次遍历2个)
	/// </summary>
	void check_Ring_2() {
		Lnode* slow = head, *fast = head->next;
		while (fast->next != nullptr && slow != fast &&fast != nullptr) {
			slow = slow->next;
			fast = fast->next->next;
		}
		if (slow == fast) {
			cout << "=======双指针跑圈结果:=================" << endl;
			cout << "链表存在环!" << endl;
		}
		else {
			cout << "=======双指针跑圈结果:=================" << endl;
			cout << "链表不存在环!" << endl;
		}
	}
};

int main() {
	LinkedList Llist;
	Llist.generateRing(2);
	Llist.print_ring_des();
	Llist.check_Ring();
	Llist.check_Ring_2();
}

运行结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

国产生骨肉冻干品控好不好?热榜TOP5生骨肉冻干分享

对于新手养猫人来说&#xff0c;进口生骨肉冻干的高价常常让人疑惑&#xff0c;为何它能在养猫达人中赢得如此高的声誉&#xff1f;与国产生骨肉冻干相比&#xff0c;进口产品的价格高出数倍&#xff0c;那么这高昂的价格是否代表了其独特的价值&#xff0c;还是只是一个消费陷…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

小白看完这篇文章也能踏进网安大门,成为网络安全工程师

前言 在当前的互联网环境下&#xff0c;不少人感受到了职场的寒冬与996工作制的压力。然而&#xff0c;无论环境如何变化&#xff0c;掌握实用的技术始终是保障职业稳定和发展的关键。特别是在网络安全这一领域&#xff0c;技术人才需求量大且持续增长。今天&#xff0c;我们将…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢&#xff1f;工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求&#xff0c;不仅有利于企业内部管理的规范化&#xff0c;还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

(CVPR,2023)SAN:用于开放词汇语义分割的边缘适配网络

文章目录 相关论文相关资料摘要引言方法对视觉 token 的特征融合使用注意力偏差进行掩码识别分割图像生成 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;…

javaWeb项目-财务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Springboot框架 …

计算机工作者学习平台

给大家分享了几个非常有用的学习平台&#xff0c;可以作为参考&#xff0c;具体为&#xff1a; 1.中国大学MOOC 中国大学MOOC_优质在线课程学习平台 2.牛客 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推&#xff0c;求职就业一站解决_牛客网 3.CSDN https://www…

Learn ComputeShader 02 Multiple kernels

前面已经成功创建了第一个compute shader&#xff0c;并且使用它替换掉quad的材质的纹理&#xff0c;现在我们将要在计算着色器中创建多个kernel。 首先调整上次的计算着色器&#xff0c;让它显示为红色。 然后再次创建一个kernel&#xff0c;显示为黄色。 结果应该是这样的…

vulhub weblogic全系列靶场

目录 简介 需要使用的工具 CVE-2017-10271 0x00 漏洞产生原因 0x01 影响范围 0x02 漏洞地址 0x03 环境 0x04 漏洞复现 1. 手工 2. 漏洞利用工具 CVE-2018-2628 0x00 漏洞产生原因 0x01 影响范围 0x02 环境 0x03 漏洞复现 1.nmap扫是否是T3协议 2.漏洞检测&…

数据结构学习之路--玩转队列的内核知识(附C源码)

嗨嗨大家~我又来啦&#xff01;今天为大家带来的是与队列相关的知识。我们马上进入知识的海洋~ 目录 前言 一、队列 1 队列的概念 2 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 队列的判空 2.4 入队 2.5 出队 2.6 取队头元素 2.7 取队尾元素 2.8 取…

CountDownLatch倒计时器源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. CountDownLatch有什么用 3. CountDownLatch底层原理 3.1. count…

React Router 6 + Ant Design:构建基于角色的动态路由和菜单

要根据用户的角色生成不同的路由菜单并实现权限控制,你可以采取以下步骤: 定义路由配置 首先,你需要定义一个包含所有可能路由的配置文件,例如: const routes [{path: /dashboard,element: <DashboardPage />,roles: [admin, manager, user]},{path: /users,element:…

Unity场景光照数据Light data asset

首先描述一下遇到的问题&#xff0c;游戏运行过程中切换场景之后发现模型接收的光照不对。 Unity编辑模式下正常显示&#xff1a; 运行模式下从其他场景切入之后显示异常&#xff1a; 排查了灯光参数和环境光以及着色器都没发现异常。 根据ChatGPT的回答&#xff0c;问题可能…

15.Nacos服务分级存储模型

服务跨集群调用问题&#xff1a; 服务调用尽可能的选择本地集群的服务&#xff0c;跨集群调用延迟较高。 本地集群不可访问的情况下&#xff0c;再去访问其他集群。 如何配置集群的实例属性&#xff1a; spring: cloud:nacos:server-addr: localhost:8848 #nacos服务端地址d…

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

数栈+AI:数栈V6.2创新发布,让数据开发更智能

近日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕&#xff0c;大会带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量、更高效率的…

究竟该怎么寄快递才能安全无误的送到手中呢?

最近&#xff0c;小编上班了发现有同事在吐槽快递送到手中的时间很晚了&#xff0c;比预计的时间差了很多&#xff0c;并且产品也有不同程度的损坏。这就让我们很是恼火了&#xff0c;但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

echart实现排名列表

function createHorizontalBarChart(chartId, data) {if (typeof echarts undefined) {console.error(请先引入 ECharts 库);return;}// 初始化echarts实例var myChart echarts.init(document.getElementById(chartId));// 对数据按照 value 进行降序排序var sortedData dat…