
剑指offer之面试题23:链表中环的入口节点
发布日期:2021-05-07 00:01:36
浏览次数:27
分类:原创文章
本文共 2161 字,大约阅读时间需要 7 分钟。
面试题23:链表中环的入口节点
题目:如果一个链表中包含环,如何找出环的入口节点?例如在下图中,环的入口节点是节点3。
解题思路:
-
第一步,如何确定链表中包含环?
定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走的慢的指针,那么链表中就包含环;如果走得快的指针走到了链表的末尾都没有追上第一个指针,那么链表就不包含环。
-
第二步,如何找到环的入口。先定义两个指针 p1 和 p2 。如果链表中的环有 n 个节点,则指针 p1 先在链表上向前移动 n 步,然后两个指针以相同的速度向前移动。当第二个指向环的入口节点时,第一个指针已经围绕着环走了一圈,又回到了入口节点。
-
第三步,如何得到环中节点的数目。在第一步中,我们用一快一慢两个指针,如果两个指针相遇,则表明链表中存在环。两个指针相遇的节点一定在环中。可以从这个节点触发,一边继续向前移动一边计数,当再次回到这个节点时,就可以得到环中的节点数了。
代码实现:
package Question23;public class T01 { public static void main(String[] args) { Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); Node node5 = new Node(5); Node node6 = new Node(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = null; System.out.println(solve(null)); } public static Node solve(Node node) { Node meeting = meetingNode(node); if(meeting == null) return null; int count = 1; Node temp = meeting.next; while(meeting != temp) { count++; temp = temp.next; } Node pNode1 = node; Node pNode2 = node; while(pNode2 != null && count > 0) { pNode2 = pNode2.next; count--; } while(pNode1 != pNode2) { pNode1 = pNode1.next; pNode2 = pNode2.next; } return pNode1; } public static Node meetingNode(Node node) { if(node == null) return null; Node pLow = node; Node pFast = node.next; while(pLow != null && pFast != null) { pLow = pLow.next; pFast = pFast.next; if(pFast != null) pFast = pFast.next; else return null; //如果两个指针相遇,说明有环,并返回这个相遇的节点 if(pLow == pFast) return pLow; } return null; }}class Node { int id; Node next; public Node(int id) { this.id = id; } @Override public String toString() { return "Node{" + "id=" + id + '}'; }}
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月01日 14时43分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
NC15553 数学考试(线性DP)
2019-03-05
MySQL两阶段提交、崩溃恢复与组提交
2019-03-05
MySQL隐藏文件.mysql_history风险
2019-03-05
如何通过文件解析MySQL的表结构
2019-03-05
ClickHouse 适用场景调研文档
2019-03-05
C++的编译过程及原理
2019-03-05
Vue——父组件将方法传递给子组件
2019-03-05
文件加密软件对于企业发展而言有何优势?局域网数据防泄密工作应该如何入手?
2019-03-05
Beautiful Soup基础入门
2019-03-05
点击控制盒子移动
2019-03-05
js求阶乘
2019-03-05
小程序图片正确使用方式(防止发布之后不显示)
2019-03-05
C++基础学习笔记08——模板
2019-03-05
Java学习
2019-03-05
Js函数
2019-03-05
Python机器学习算法基础概述
2019-03-05
关于OCR的一些有用的技术博客文章链接
2019-03-05
jquery中用on事件委托的方式绑定事件
2019-03-05
蓝桥杯 2016c/c++A组 方格填数
2019-03-05
L1-039 古风排版 (20分)
2019-03-05