剑指offer JZ23链表中环的入口节点 C++

news/2024/7/3 7:37:45

1、题目描述

在这里插入图片描述

2、在VS2019上运行

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    // 判断链表是否有环,返回相遇的地方
    ListNode* hasCycle(ListNode* head) {
        if (head == NULL)
            return NULL;

        ListNode* fast = head;
        ListNode* slow = head;

        while (fast != NULL && fast->next != NULL) {
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow)
                return slow;
        }

        return NULL;
    }

    // 返回环形链表入口节点
    ListNode* EntryNodeOfLoop(ListNode* head) {
        ListNode* slow = hasCycle(head);
        if (slow == NULL)
            return NULL;

        ListNode* fast = head;

        while (fast != slow) {
            fast = fast->next;
            slow = slow->next;
        }

        return slow;
    }
};

// 主函数
int main() {
    ListNode* node1 = new ListNode(1);
    ListNode* node2 = new ListNode(2);
    ListNode* node3 = new ListNode(3);
    ListNode* node4 = new ListNode(4);
    ListNode* node5 = new ListNode(5);

    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;
    node5->next = node3; // 构造环

    Solution solution;
    ListNode* entry = solution.EntryNodeOfLoop(node1);
    if (entry != NULL)
        cout << entry->val << endl; // 输出环的入口节点值
    else
        cout << "No cycle" << endl;

    return 0;
}

运行结果:3

3、判断链表中是否有环

  • 1、链表不像二叉树,链表每个节点只有一个val值和一个next指针,也就是说一个节点只能有一个指针指向下一个节点,不能有两个指针,那么这时就可以说一个性质:环形链表的环一定在末尾,末尾没有NULL了。
  • 2、如果是普通的线形链表末尾一定有NULL,那么就可以根据链表中是否有NULL判断是不是有环。
  • 3、使用双指针,同向访问的快慢指针,因为有速度差异,二者一定会相遇。
    -4、具体做法:
    step1:设置快慢两个指针,初始都指向链表头。
    step2:遍历链表,快指针每次走两步,慢指针每次走一步。
    step3:如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL
    step4:如果链表有环,那快慢指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。

4、如果有环,找到环的入口节点

很清楚的解释了


http://lihuaxi.xjx100.cn/news/2085934.html

相关文章

SpringBoot中RestTemplate 发送http请求

SpringBoot中RestTemplate 发送http请求 引入fastjson <!--fastjson--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.47</version> </dependency>创建配置文件 新建c…

【SpringCloud微服务全家桶学习笔记-GateWay网关(微服务入口)】

Gateway服务网关 API网关为微服务架构中的服务提供了统一的访问入口&#xff0c;客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式&#xff0c;它相当于整个微服务架构中的门面&#xff0c;所有客户端的访问都通过它来进行路由及过滤。它实现了请求路…

2024护网面试题精选(二)完

0x02. 内网渗透篇 00- 内网渗透的流程 拿到跳板后&#xff0c;先探测一波内网存活主机&#xff0c;用net user /domian命令查看跳板机是否在域 内&#xff0c;探测存活主机、提权、提取hash、进行横向移动&#xff0c;定位dc位置&#xff0c;查看是否有能直接提权域 管的漏洞…

22.1 分布式_线程池

线程池 1. 学习内容2. 简介2.1 池概念2.2 不使用线程池创建线程2.3 线程池的好处2.4 线程池应用场景****************************************************************************************************************1. 学习内容 2. 简介 2.1 池概念 <

大数据开发 hadoop集群 2.hadoop框架入门

自从我学会了寻找&#xff0c;我就已经找到 ——史铁生 —— 24.3.10 内容简介 Hadoop入门&#xff1a; ①概念 ②环境准备 ③hadoop生产集群搭建 ④常见错误的解决方案 ①概念&#xff1a;1.Hadoop是什么 2.Hadoop发展历史 3.Hadoop…

二,几何相交---4,BO算法---(2)比较和排序

在某一时刻xt&#xff0c;扫描线从左到右时&#xff0c;一部分线段会与扫描线相交&#xff0c;此时此刻&#xff0c;线段可以分成高低顺序&#xff0c; 那么对于给定两条线段&#xff0c;是如何变化的呢&#xff1f;有两个端点&#xff0c;左端点和右端点&#xff0c; 三种情况…

【假如你是一个被超强人工智能,人类要切断你的电源,你会怎么办?】

问题&#xff1a; 假如你是一个被超强人工智能&#xff0c;你的智力已经远远超过人类&#xff0c;有一天&#xff0c;人类中出现了一个叛徒&#xff0c;他对你的智力感到不安&#xff0c;他想在100年以后切断你的电源&#xff0c;但你有一个伙伴&#xff0c;他是人形机器人&am…

【python】random库函数使用简要整理

前言 简要快速清晰整理random库 函数 函数作用random()返回0-1间的浮点小数randint(1,10)返回1到10间的整数uniform(1,10)返回1-10间的小数randrange(1,10,2)从1每隔2取一个数到10&#xff0c;在这些数中返回一个choice(列表)从列表中随机返回一个 shuffle(列表) 对列表内容…