package algorithms;

 /*
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}
*/ /*
* 首先判断链表中是否有环 思路是用两个指针,同时从链表的节点出发
* 一个走的慢,一个走的快
* 如果两个指针不能相遇则无环,否则有环
*
* 如何找到环的入口?
* 还是先定义两个指针,p1,p2
* n代表链表中环的节点个数
* p1先向前移动n步
* 然后两个指针以相同的速率向前移动
* 两个指针相遇的地方就是环的入口地址(总结规律出来的)
*
* 接下来就是如何求环中节点的个数
* 两个指针相遇的地方一定是在环的内部
* 所以可以从这个节点出发,边走边计数
* 当再次回到这个节点的时候 就知道环中节点的个数了
* */
public class EntryNodeOfLoop { public ListNode EntryNodeOfLoop_1(ListNode pHead) {
//返回相遇的节点
ListNode meetingNode = meetingNode(pHead);
if (meetingNode == null)
return null;
int countOfLoop = 1;
ListNode node1 = meetingNode.next;
//求出圈的长度
while (node1 != meetingNode) {
countOfLoop++;
node1 = node1.next;
}
//p1向前移动圈长的长度
node1 = pHead;
for (int i = 0; i < countOfLoop; i++) {
node1 = node1.next;
}
//两个节点同时向前移动 相遇的地方就是圈的开始
ListNode node2 = pHead; while (node1 != node2) {
node1 = node1.next;
node2 = node2.next;
} return node1; } // 判断链表中是否有环 并找到相遇的节点
ListNode meetingNode(ListNode pHead) {
if (pHead == null)
return null;
ListNode slowNode = pHead;
ListNode fastNode = slowNode.next;
while (fastNode != null && slowNode != null) {
if (fastNode == slowNode)
return fastNode;
slowNode = slowNode.next;
fastNode = fastNode.next;
if (fastNode != null)
fastNode = fastNode.next;
}
return null; }
}

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

  1. 给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

    // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...

  2. 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

    /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...

  3. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...

  4. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  5. 最短路径(给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。)

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 例: 输入: [ [1,3,1], [1,5,1], [ ...

  6. 【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2.3.2,2.2.5,4.2}, 因为数组中数字2出现了5次,超过数组的长度的一半,因此输出2 ...

  7. 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点

    [试题描述]定义一个函数,输入一个链表,判断链表是否存在环路,并找出回路起点 Circular linked list: A (corrupt) linked list in which a node ...

  8. Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。

    返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...

  9. delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)

    function FindWindowThroughWindowText(WindowText: string): THandle;var  hCurrentWindow: THandle;  cnt ...

随机推荐

  1. 读书笔记:Information Architecture for the World Wide Web, 3rd Edition 北极熊 简介

    书籍介绍 Information Architecture for the World Wide Web, 3rd Edition<web信息架构:设计大型网站(第三版)> Designi ...

  2. web 开发之js---理解并解决IE的内存泄漏方式

    程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...

  3. [计算机故障]笔记本无法启动,开机启动出现“Operating System Not Found”无法进系统

    背景介绍:同事的一台索尼的笔记本,安装XP.开机启动出现“Operating System Not Found”无法进系统 诊断: 初步判断硬盘故障.但听声音,没有异响. 开机按F2进入BIOS设置. ...

  4. cassandra的全文检索插件

    https://github.com/Stratio/cassandra-lucene-index Stratio’s Cassandra Lucene Index Stratio’s Cassand ...

  5. Java 系统工具类 —— System、Scanner、Runtime

    0. 静态成员变量 System.out:是 PrinterStream 型变量: public final class System { ... public final static InputS ...

  6. poj1286 Necklace of Beads—— Polya定理

    题目:http://poj.org/problem?id=1286 真·Polya定理模板题: 写完以后感觉理解更深刻了呢. 代码如下: #include<iostream> #inclu ...

  7. oracle 统计/分析函数

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 语法: Sql代码 <analytic ...

  8. log4j日志基本配置

    Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...

  9. 10.23NOIP模拟题

    叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...

  10. python中socket编程

    一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...