【题目】一个链表中包含环,请找出该链表的环的入口结点。

【思路】方法一:使用双指针

   方法二:利用set集合的特性,不能添加重复数字,否则返回false
 package com.exe7.offer;

 /**
* 【题目】一个链表中包含环,请找出该链表的环的入口结点。
* @author WGS
*
*/
public class EntryNodeOfLoop { class LinkNode{
int val;
LinkNode next=null;
public LinkNode(int val){
this.val=val;
}
}
//得到闭环中任一相遇结点
public LinkNode getMeetingNode(LinkNode headNode){
if(headNode==null) return null;
LinkNode slowNode=headNode;
LinkNode fastNode=slowNode.next; while(slowNode!=null && fastNode!=null){
if(slowNode==fastNode)
return fastNode;
slowNode=slowNode.next;
fastNode=fastNode.next;
if(fastNode!=null)
fastNode=fastNode.next;
}
return null; }
public LinkNode getNodeOfLoop(LinkNode headNode){
if(headNode==null) return null; LinkNode meetingNode=getMeetingNode(headNode);
if(meetingNode==null)
return null;
//1 首先根据得到的闭环中得到的结点确定闭环中结点的总共数目
int numOfLoop=1;
LinkNode pNode1=meetingNode.next;
while(pNode1!=meetingNode){
pNode1=pNode1.next;
numOfLoop++;//得到闭环节点数目
} //2 根据双指针确定入环结点
pNode1=headNode;
for(int i=0;i<numOfLoop;i++){
pNode1=pNode1.next;
}
LinkNode pNode2=headNode;
while(pNode1!=pNode2){
pNode1=pNode1.next;
pNode2=pNode2.next;
}
return pNode1; }
public static void main(String[] args) {
// TODO Auto-generated method stub } }
 /**
* 方法二:利用set集合的特性,不能添加重复数字,否则返回false
* @param args
*/
public LinkNode EntryNodeOfLoop(LinkNode headNode){
Set<LinkNode> set=new HashSet<>();
while(headNode!=null && set.add(headNode)){
headNode=headNode.next;
} return headNode; }

剑指offer系列29-----链表中环的入口节点-的更多相关文章

  1. 【剑指offer】删除链表中重复的节点,C++实现(链表)

    0.简介       本文是牛客网<剑指offer>笔记. 1.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1-> ...

  2. 【剑指offer】单链表尾部插入一个节点

    #include <iostream> using namespace std; //链表结构体 struct ListNode { int m_Value; ListNode *next ...

  3. 剑指offer-面试题23-链表中环的入口节点-双指针

    /* 题目: 如果链表中包含环,如何找出环的入口? */ /* 思路: 双指针: 1.判断是否有环. fast指针一次2步,slow指针一次1步,当fast与slow相遇时,说明有环. 2.判断环路中 ...

  4. 剑指offer系列31-----二叉树的下一个节点

    [题目]给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. package com.exe7.offer; /** ...

  5. 剑指Offer - 两个链表第一个公共节点

    https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage= ...

  6. 剑指Offer:链表中环的入口节点【23】

    剑指Offer:链表中环的入口节点[23] 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和 ...

  7. 【剑指offer】面试题 23. 链表中环的入口节点

    面试题 23. 链表中环的入口节点

  8. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  9. 剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 Offer 24 题目描述: 常规解法 本题的解法很常规,没有其他特别的坑,只需要将链表反转即可. package com.walegarrett.offer; / ...

随机推荐

  1. elfutils-libelf由于依赖而安装失败

    在Redhat安装Oracles前需要按照依赖包,但是在安装elfutils-libelf遇到了两个包相互依赖的情况 [root@rhvm1 /]# rpm -i elfutils-libelf-de ...

  2. iOS中计算文件夹中文件大小

    通常用于删除缓存的时,计算缓存大小 //单个文件的大小 - (long long) fileSizeAtPath:(NSString*) filePath{ NSFileManager* manage ...

  3. centos 用户组

    centos 用户组和用户的添加及所属问题 指定附加组   eg:dy 为组名 ,lisi 为用户,要把lisi 用户添加到 dy 组里面 useradd -G dy lisi 可以同时添加多个组, ...

  4. Gridview中DataKeyNames 设置多个主键 取值

    1.设置DataKeyNames a.F4  在属性面板中设置   多个值以逗号隔开  例如id,mane,sex b.通过后台代码 this.gridview.DataSource = Bind() ...

  5. dbcp基本配置和重连配置 -- mysql 8小时自动断开连接的问题

    1. 引入dbcp (选择1.4) Java代码   com.alibaba.external jakarta.commons.dbcp 1.4 2. dbcp的基本配置 相关配置说明: initia ...

  6. Jquery_笔记

    1.请确保在 <body> 元素的onload事件中没有注册函数,否则不会触发+$(document).ready()事件.

  7. makefile--模式规则(七)

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 上一节讲到目录创建成功,目标文件没有生产到对应目录下,这里我们先给目标文件加上对应目录,这样的话 ...

  8. 使用CURL下载远程文件保存到服务器

    比如微信公众平台开发,下载用户的头像到服务器上: /** * 使用CURL获取远程文件保存到服务器 *@param $image=$oJSON->headimgurl; 获取到的微信返回的头像U ...

  9. STM32时钟系统

    一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...

  10. 【转】win7 uac关闭

    方法1: 原文网址:http://jingyan.baidu.com/article/c275f6bae2650ce33d756795.html 首先点击开始,并在输入框中输入“MSCONFIG”,打 ...