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

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

   方法二:利用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. Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  2. js中this和回调方法循环-我们到底能走多远系列(35)

    我们到底能走多远系列(35) 扯淡: 13年最后一个月了,你们在13年初的计划实现了吗?还来得及吗? 请加油~ 主题: 最近一直在写js,遇到了几个问题,可能初入门的时候都会遇到吧,总结下. 例子: ...

  3. MongoDB国内学术研究(部分)

    1.<MongoDB在煤炭行业GIS数据存储方面的应用> mongoDB的技术介绍占到了文章的60%,剩下的还能说些啥呢,呵呵. 2.<基于MongoDB的矢量空间数据云存储与处理系 ...

  4. Codeforces Round #104 (Div. 1)

    A.Lucky Conversion 题意 给定两个长度为 \(N(N \le 10^5)\) 且由4和7构成的 \(a, b\)串 对 \(a\) 可以有两种操作: 交换两个位置的字符; 改变一个位 ...

  5. POJ 1469 COURSES(二部图匹配)

                                                                     COURSES Time Limit: 1000MS   Memory ...

  6. Android——AutoCompleteTextView、Spinner和消息提示

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  7. codeForce-19D Points (点更新+离散化)

    题目大意:在二维坐标系的x正半轴,y正半轴和第一象限内,有三种操作: 1.add x,y (添加点<x,y>): 2.remove x,y(移除点<x,y>): 3.find ...

  8. Oracle数据库五种约束

    oracle 数据库 数据表的5个约束类型:1.主键约束2.外键约束3.唯一约束4.检查约束5.非空约束 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包含 ...

  9. js获取ifram对象

    1.获取iframe对象 var doc=document.getElementById('frameId').contentWindow.document; //var doc=parent.doc ...

  10. Android Studio导入GitHub上的项目常见问题(有例子)

    前言:github对开发者而言无疑是个宝藏,但想利用它可不是件简单的事,用Android studio导入开源项目会遇到各种问题,今天我就以github上的一个图片轮播项目为例,解决导入过程中的常见问 ...