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

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

   方法二:利用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. codeforce The Art of Dealing with ATM

    题目大意 ATM取款机有n种不同的钱币kind[i],每次取款允许吐出不超过k张钱币,且钱币的种类数不能超过2(一开始没理解2的意思),现在有q次取款,钱数为ques,问ATM能否凑出这样的钱,若能的 ...

  2. 对UICollectionView的学习

    UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableVie ...

  3. Java-->实现群聊功能(C/S模式--TCP协议)

    --> Java 对TCP协议的支持: --> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端. -- ...

  4. css 属性积累

    1. letter-spacing:6px;    //属性增加或减少字符间的空白(字符间距) 2. cursor                       // 鼠标移上去的鼠标状态 属性值有: ...

  5. URIEncoding和useBodyEncodingForURI详解

    之前关于编码的问题已经总结过两次了,有些地方写的很粗略.http://blog.itpub.net/29254281/viewspace-775925/http://blog.itpub.net/29 ...

  6. spring-AOP-添加日志

    1 把一个类声明为一个切面:①需要把该类放入到IOC中,②再声明为一个切面(@Aspect @Component)@Order(1):指定顺序 2 在配置文件中添加如下配置:<aop:aspec ...

  7. scala言语基础学习

    scala变长参数: 递归累加: scala异常的使用: array和arraybuffer的使用 定长array: arraybuff:

  8. HDU-5532 Almost Sorted Array (LIS)

    题目大意:给一个n个数的序列,问这个序列删掉一个数后是否有序. 题目分析:找最长上升子序列和最长下降子序列,只要有一个的长度不小于n-1即可. 代码如下: # include<iostream& ...

  9. html5 input type=search

    <style> input[type="search"]{ border-radius:2px;} input::-webkit-search-cancel-butto ...

  10. 详解LUA开发工具及其环境配置

    LUA开发工具及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置,第一次接触LUA的话,就跟本人一起学习吧.看我能不能忽悠到你. LUA是语言,那么一定有编写的工具.第 ...