题目

若一个链表中包含环,如何找出的入口结点?如下图链表中,环的入口节点的节点3。

分析

  1. 一快(移两节点)一慢(移一节点)两指针判断链表是否存在环。
  2. 算出环有几个节点(上一步的两指针可知是在环中,让慢指针停止遍历,让快指针改为一节点一节点然后两指针一动一静的计算出环有多少个节点)。
  3. 重置两指针指向链头,一指针移动2. 步骤得出n,然后两指针一起移动。当两指针相遇,此时它们指向的环的入口结点

放码

import com.lun.util.SinglyLinkedList.ListNode;public class FindEntryNodeOfLoop {public ListNode find(ListNode head) {//1.判断是否存在环ListNode meetNode = meetNode(head);if(meetNode == null) {return null;}int nodesInLoop = 1;ListNode node1 = meetNode;//2.计算环内节点while(node1.next != meetNode) {nodesInLoop++;node1 = node1.next;}//3.先移动node1, 次数为环中节点的数目node1 = head;for(int i = 0; i < nodesInLoop; i++)node1 = node1.next;ListNode node2 = head;while(node1 != node2) {node1 = node1.next;node2 = node2.next;}return node1;}public ListNode meetNode(ListNode head) {if(head == null)return null;ListNode slow = head.next;if(slow == null) {//链表只有一个节点return null;}ListNode fast = slow.next;while(fast != null && slow != null) {//可能循环几次才能碰上if(fast == slow) {return fast;}slow = slow.next;fast = fast.next;if(fast != null) {fast = fast.next;}}return null;}}

测试

import static org.junit.Assert.*;import org.junit.Test;import com.lun.util.SinglyLinkedList;
import com.lun.util.SinglyLinkedList.ListNode;public class FindEntryNodeOfLoopTest {@Testpublic void test() {  FindEntryNodeOfLoop fl = new FindEntryNodeOfLoop();ListNode n1 = new ListNode(1);ListNode n2 = new ListNode(2);ListNode n3 = new ListNode(3);ListNode n4 = new ListNode(4);ListNode n5 = new ListNode(5);ListNode n6 = new ListNode(6);n1.next = n2;n2.next = n3;n3.next = n4;n4.next = n5;n5.next = n6;n6.next = n3;//n3为入口节点assertEquals(3, fl.find(n1).val);//没有环的链表assertNull(fl.find(SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6})));}@Testpublic void test2() {FindEntryNodeOfLoop fl = new FindEntryNodeOfLoop();      assertNull(fl.meetNode(SinglyLinkedList.intArray2List(new int[] {1, 2, 3, 4, 5, 6})));}}

《剑指Offer》23:链表中环的入口节点相关推荐

  1. 《剑指offer》链表中环的入口节点

    题目:一个链表中包含环,请找出该链表的环的入口结点. 解析:思想是用list存储从头开始遍历的链表节点,如果list集合不存在该节点,就把该节点添加进list,然后继续遍历下一个.当list中包含当前 ...

  2. 剑指offer 23. 链表中环的入口

    1.问题描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 2.解决思路 2.1 思路1 1)先判断链表是否有环: 2)如果有环,假设环里面有n个结点,除去环之外有m个结 ...

  3. 剑指offer之链表中环的入口结点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路 利用一个std::set判重即可,第一次重复的,肯定是环的入口节点. AC代码 /* struct Li ...

  4. [剑指Offer] 55.链表中环的入口结点

    题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. 1 /* 2 struct ListNode { 3 int ...

  5. 剑指offer:链表中环的入口结点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题 快慢指针,fast走两步,slow走一步,当他们相遇时,fast走了一圈环,设环为n个节点,此时slow走的 ...

  6. 【剑指offer】链表中环的入口

    问题描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3 ...

  7. 剑指Offer——JZ55.链表环的入口结点【快慢指针】

    题目传送门 题解 **解法一:**记录走过的结点,遇到走过的判定为有环 解法二: AC-Code /* struct ListNode {int val;struct ListNode *next;L ...

  8. python实现剑指offer删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 剑指offer.删除链表中重复的节点

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留. 样例1 输入:1->2->3->3->4->4->5输出:1->2-> ...

  10. 剑指offer-面试题23:链表中环的入口节点 快慢指针+双指针

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null.如图所示,节点3是链表中环的入口节点 本题的解决分为两步:(1)确定链表中是否有环(2)如果有环,确定环的入口节点. ...

最新文章

  1. mysql凡人入门_3种PHP连接MYSQL数据库的常用方法
  2. 阿里 双11 同款,流量防卫兵 Sentinel go 源码解读
  3. DCMTK:生成内置的数据字典
  4. freemaker .flt文件自动换行的问题,map循环获取key和value
  5. JAVA——实验肆——多线程
  6. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
  7. 空间计量模型_5种经典空间计量模型的回归命令、程序及原始数据:SAR模型、SDM模型、SAC模型、SEM模型及GSPRE模型...
  8. C++判断一个数是否为素数
  9. 工业机器人图册 索罗门采夫_机械手控制系统设计(完整图纸)
  10. 华为手机的nfc是什么功能_NFC功能是什么意思,华为手机NFC功能怎么用,NFC常用功能场景...
  11. Proxy(代理)服务器
  12. 远程桌面不能复制粘贴
  13. Linux设备驱动编程第三版-笔记
  14. win策略计算机配置,BGinfo配置策略(Server2012R2-Win10)
  15. 最新高品质+西安市区建筑物范围面shp格式+小区大厦学校医院占地面积
  16. Web3专属的流支付协议,Zebec把它玩出了新的花样
  17. ERP : 投入控制
  18. Arcgis使用教程(三)空间数据采集与编辑
  19. 加米谷大数据干货:Kafka如何实现每秒上百万的超高并发写入?
  20. 品类甚至远比品牌更能影响一个企业

热门文章

  1. c++ char*初始化_C开发实战-深入理解指针
  2. 华为鸿蒙发布2.0,华为做到了!鸿蒙2.0正式发布,苹果安卓有危机?
  3. 【转】wifi的几种工作模式
  4. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
  5. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式
  6. 一步步编写操作系统 57 门、调用门与RPL序 2
  7. python爬虫淘宝手机_【Python3 爬虫】14_爬取淘宝上的手机图片
  8. 与gps优缺点_长缨在手,敢缚苍龙,中国北斗三号圆满收官,相比美国GPS怎样?...
  9. CCNP-第十五篇-VXLAN(一)
  10. 【HDU - 3440】House Man(差分约束)