博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(58):链表中环的入口节点
阅读量:4286 次
发布时间:2019-05-27

本文共 2157 字,大约阅读时间需要 7 分钟。

题目描述

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

分析

在文章提到使用两个前后指针来定位链表中的倒数第k个节点。在题目扩展中提到了可以使用两个快慢指针来判断链表中是否存在环。

本题是两种思路的结合:第一步先使用两个快慢指针(初始指向头结点相邻的节点)判断是否存在环,如果存在,则两个快慢指针一定会相遇,并且相遇的节点(记为meetingNode)一定处于环内,否则,不存在环,自然也不存在环的入口节点;第二步根据meetingNode遍历环,得到环的大小(包含的节点数,记为k),使用两个前后指针初始均指向头结点,前指针先移动k步,之后两个指针同时移动,当两个指针相遇时,指向的节点就是环的入口。

下面是剑指offer中的示意图:节点3是环的入口节点。

链表中环的入口节点

牛客AC:

/* public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null || pHead.next == null) return null; ListNode meetingNode = getMeetingNode(pHead); // 获取环内的一个节点 if(meetingNode == null) // 不存在环 return null; // 从环内节点开始遍历环,再次遇到该节点时,统计环的节点数目 int countInLoop = 1; ListNode tmpNode = meetingNode; while(tmpNode.next != meetingNode) { tmpNode = tmpNode.next; countInLoop++; } // 使用前后指针寻找环入口 // 前指针先移动count个节点后,前后指针同时移动 // 两个指针相遇时的节点,一定是环的入口节点。 ListNode pAhead = pHead; for(int i = 0; i < countInLoop; i++) pAhead = pAhead.next; ListNode pBehind = pHead; while(pAhead != pBehind) { pAhead = pAhead.next; pBehind = pBehind.next; } return pAhead; } /** * 使用快慢指针获取环内的一个节点, * 利用该节点可以进一步统计环的节点数目,即环的大小 * @param pHead * @return */ public ListNode getMeetingNode(ListNode pHead) { if(pHead == null || pHead.next == null) // 至少包含两个节点 return null; ListNode meetingNode = null; // 环内的一个节点 ListNode pSlow = pHead; // 快慢指针初始指向相邻的两个节点 ListNode pFast = pSlow.next; // 遍历链表,当快慢指针相遇时,该节点一定处于环的内部 while(pSlow != null && pFast != null) { if(pSlow == pFast) { meetingNode = pFast; break; } // 慢指针移动一次,快指针移动两次 pSlow = pSlow.next; pFast = pFast.next; if(pFast != null) pFast = pFast.next; } return meetingNode; // 返回获取的环内节点 }}

参考

1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

你可能感兴趣的文章
正则表达式入门教程(四)
查看>>
JAVA程序员成长之路的总结
查看>>
javaEE工程师学习路线图
查看>>
java工程师进阶之路
查看>>
linux系统一个tomcat配置两个域名,每个域名对应一个项目
查看>>
javaScript使用Lodop实现网页表格套打功能
查看>>
技术大牛如何寻找下一个风口
查看>>
大数据学习路线大纲
查看>>
html入门之meta
查看>>
mvn不是内部或外部命令,也不是可运行的程序或批处理文件
查看>>
JAVA:JDBC连接MySQL数据库
查看>>
struts2流程简述
查看>>
struts2文件上传和下载
查看>>
值栈与OGNL
查看>>
struts2标签库--分类入门
查看>>
Struts2声明式异常处理
查看>>
Web.xml中jsp-config元素简述
查看>>
Struts2类型转换和自定义类型
查看>>
Java面向对象特征有那些
查看>>
hibernate单表继承映射
查看>>