博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表中环的入口节点
阅读量:4091 次
发布时间:2019-05-25

本文共 1811 字,大约阅读时间需要 6 分钟。

 

目录


 

一、问题描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

 

二、代码实现

1、哈希法

循环遍历单链表的每个节点,

    如果当前节点的地址出现在set中,则说明它是环的入口节点,直接返回

    如果没有出现在set中,则将其添加到set中

当退出循环,说明链表不存在环,返回null(如果存在,在循环中就应该返回了)

/* public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/import java.util.HashSet;public class Solution {        //哈希法    public ListNode EntryNodeOfLoop(ListNode pHead) {        HashSet
set = new HashSet<>(); while (pHead != null) { if (set.contains(pHead)) { return pHead; } set.add(pHead); pHead = pHead.next; } return null; }}

2、双指针法

第一步,让快慢指针均指向头节点,然后fast指针一次走两步,slow指针一次走一步。如果期间fast变为null或者fast.next变为null,说明链表不存在环,直接返回null。如果期间存在fast == slow,说明链表存在环,并记此时的节点为快慢指针第一次相遇的节点p。

第二步,让slow指针重新指向头节点、fast原地不动,然后让slow指针、fast指针每次走一步,则它们再次相遇的地方,就是环的入口节点q。

证明:在第一步中,由于快指针的速度是慢指针的两倍,并且它们在p点相遇,则2(a + b) = a + (n-1)b + (n-1)c + b,则a = (n-2)b + (n-2)c + c,所以当slow指针走a步时,fast走了(n-2)b + (n-2)c + c步,正好走到q点,与slow指针碰面,而这个q点正好是环的入口点。

/* public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {    //双指针法    public ListNode EntryNodeOfLoop(ListNode pHead)    {        //1、判断是否有环        ListNode slow = pHead, fast = pHead;        while (fast != null && fast.next != null) {            slow = slow.next;            fast = fast.next.next;                        if (slow == fast) {                break;            }        }                //不存在环        if (fast == null || fast.next == null) {            return null;        }        //存在环        //2、找到环的入口节点        slow = pHead;        while (slow != fast) {            slow = slow.next;            fast = fast.next;        }        return slow;    }}

 

参考:

 

转载地址:http://pfnii.baihongyu.com/

你可能感兴趣的文章
ACfly也是基于FreeRTOS的
查看>>
我发现七月在线的GAAS课程基本都讲到了
查看>>
电机堵转
查看>>
carzepony也在想往FreeRTOS上迁移
查看>>
可以买个好点的电烙铁
查看>>
ACfly调参记录(包括ACfly-F330和ACfly-T265)
查看>>
一定记得每飞几次或者隔一天要把螺丝和浆帽拧一次,确实会松的
查看>>
《多旋翼无人飞行器嵌入式飞控开发指南》里基于FreeRTOS的无人机软件框架
查看>>
思岚A1的SDK其实很好读懂,每个函数清晰明了,可以直接调用
查看>>
串级 PID 为什么外环输出是内环的期望?(和我之前对串级PID的总结一样)
查看>>
我刚刚才完全清楚GPS模块的那根杆子是怎么固定安装好的
查看>>
去github里面找找也没有别人无人机+SLAM的工程
查看>>
现在明白为什么无名博客里好几篇文章在讲传感器的滞后
查看>>
Pixhawk解锁常见错误
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>