给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
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。的更多相关文章
- 给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...
- 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 最短路径(给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 例: 输入: [ [1,3,1], [1,5,1], [ ...
- 【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2.3.2,2.2.5,4.2}, 因为数组中数字2出现了5次,超过数组的长度的一半,因此输出2 ...
- 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
[试题描述]定义一个函数,输入一个链表,判断链表是否存在环路,并找出回路起点 Circular linked list: A (corrupt) linked list in which a node ...
- Java初学者作业——编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字。
返回本章节 返回作业目录 需求说明: 编写Java程序,在控制台中输入一个数字,要求定义方法实现找出能够整除该数字的所有数字. 实现思路: 定义方法findNums(),用于实现查找所有能够整除指定数 ...
- delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)
function FindWindowThroughWindowText(WindowText: string): THandle;var hCurrentWindow: THandle; cnt ...
随机推荐
- cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
我的卡牌游戏卡牌有两个类.各自是OpenCard和CardSprite. 不知道分成两个是不是有些奇怪.我分开的原因是:一个卡牌用来当手牌,一个用来当场上的牌,这样说是不是更加奇怪了.. 玩家类里定义 ...
- hdu 1258 Sum It Up (dfs+路径记录)
pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Android如何进行单元测试
Menifest.xml中加入: <application>中加入: <uses-library android:name="android.test.runner&quo ...
- Java:String和Date、Timestamp之间的转换【转】
原文地址:http://yunnick.iteye.com/blog/1074495 一.String与Date(java.util.Date)互转 1.1 String -> Date Str ...
- 洛谷 P1383 高级打字机==codevs 3333 高级打字机
P1383 高级打字机 18通过 118提交 题目提供者yeszy 标签倍增图论高级数据结构福建省历届夏令营 难度省选/NOI- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 早苗入手 ...
- neo4j 张一鸣 8
头条关注 粉丝关系 张一鸣 8
- UniDAC连接Embedded MySQL server
Simple question about MySQL embedded application. Post a reply 7 posts • Page 1 of 1 Simple ques ...
- YTU 2690: 用双重循环实现小九九
2690: 用双重循环实现小九九 时间限制: 1 Sec 内存限制: 128 MB 提交: 848 解决: 573 题目描述 小九九是我们小时候常背的的乘法算术法则,现在用双重循环来实现小九九 1 ...
- Android studio导入项目时的问题(Re-download dependencies and sync project (requires network))
引入了别人的项目出现了这种情况提示是跟gradle cache有关,我的解决方法是跟gragle的配置有关 改下这个: distributionUrl=https\://services.gradle ...
- JFreeChart自我总结
想飞就别怕摔 大爷的并TM骂人 JFreeChart自我总结 1.饼图.柱状图.折线图生成的工具类 1 package com.text.util; 2 3 import java.awt. ...