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

目录

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

前言

前几天我写的代码,都是把所有的内容写在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;}// 将当前节点加入mapm[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.hqwc.cn/news/651512.html

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

相关文章

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics &#xff08;GPB&#xff09;发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

Spring事务回滚核心源码解读

记一次Springboot事务超时不回滚的分析过程 在Springboot中&#xff0c;我用的xml进行事务管理&#xff0c;DataSourceTransactionManager作为事务管理器&#xff0c;配置了事务控制在Service层&#xff1b;在事务管理器中&#xff0c;配置了defaultTimeout事务超时时间为5秒&…

IEC 62680新规上线,慧能泰设备端PD协议芯片带你勇闯欧盟

2022年12月7日&#xff0c;欧盟发布了Directive (EU) 2022/2380&#xff0c;强化了通用充电器的规定&#xff0c;并计划于2024年12月28日起&#xff0c;在所有欧盟国家强制执行该指令。此修订主要针对新生产的手机、平板、相机、耳机、游戏机、音箱、电子书、键盘、鼠标、导航仪…

使用knuth Durstenfeld Shuffle置乱关键区域

示意图 使用knuth Durstenfeld Shuffle置乱关键区域。比较典型的就是当我们对图像进行小波变换后&#xff0c;能量主要集中在左上角。 将图像进行排列&#xff0c;将关键区域置于整个序列的末尾&#xff0c;从末尾开始逐个交换&#xff0c;完成置换。 为了演示方便&#xff0c…

第 3 篇 : Netty离线消息处理(可跳过)

说明 仅是个人的不成熟想法, 未深入研究验证 1. 修改 NettyServerHandler类 package com.hahashou.netty.server.config;import com.alibaba.fastjson.JSON; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHan…

CRM客户管理系统盘点2024:16款顶级系统PK赛,寻找最佳利器

客户关系管理系统&#xff08;CRM&#xff09;在企业数字化转型的过程中扮演着至关重要的角色。选择一个高效、功能丰富的CRM客户管理系统&#xff0c;对于确保企业未来健康、稳定的发展至关重要。当前市场上存在着众多的CRM客户管理系统件&#xff0c;每个软件都有其独特的功能…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统&#xff0c;目前已在多家三级级医院应用&#xff0c;并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c&#xff0c;这3个分别需要满足不同的条件: a&#xff1a;设置a值&#xff1b;值大于6000000&#xff1b;长度不超过3&#xff1b; b&#xff1a;设置b值&#xff1b;MD…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

Linux2.6内核进程调度队列

目录 运行队列runqueue 活跃队列&过期队列 queue[140]&优先级&队列数组下标 bitmap[5]&O(1)调度算法 nr_active active指针和expired指针 O(1)调度算法之调度过程 本篇是Linux进程概念篇的最后一篇&#xff0c;Linux2.6内核是一个具体的/可行的/实际的存…

【计算机系统基础读书笔记】1.1.2 冯诺依曼机基本结构

1.1.2 冯诺依曼机基本结构 冯诺依曼机基本结构如图所示&#xff1a; 模型机中主要包括&#xff1a; 主存储器&#xff1a;用来存放指令和数据&#xff0c;简称主存或内存&#xff1b; 算数逻辑部件&#xff08;Arithmetic Logic Unit&#xff0c;简称ALU&#xff09;&#x…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…