java数据结构面试问题—快慢指针问题
上次我们学习了环形链表的数据结构,那么接下来我们来一起看看下面的问题,
判断一个单向链表是否是环形链表?
看到这个问题,有人就提出了进行遍历链表,记住第一元素,当我们遍历后元素再次出现则是说明是环形链表,如果没有这是一个单向非环形链表。
我们来分析下上述的解决方法,我们分析这个程序的时间复杂度则是O(n)。 那么是不是最优的选择呢?
我们引入新的解决思路,那就是“快慢指针”。 我们来看看接下来的解决思路,是否比上面的思路有优化的地方。
思路: 当我们在遍历链表的时候,我们设计两个指针,分别是快指针和慢指针,块指针每次走2步,而慢指针每次走1步,这样的话在当我们两个指针在链表中,如果会第二次相遇则说明这里面的链表是环形链表。
我们来用代码实现
|
/** * 查看 链表中是否存在环形 * * @return */ public boolean hasRing() { if (head != null && size > 0) { Node<T> fastTemp = head, lowTemp = head; while (lowTemp.getNext() != null && fastTemp.getNext() != null) { fastTemp = fastTemp.getNext().getNext(); lowTemp = lowTemp.getNext(); if (lowTemp == fastTemp) { return true; } } } return false; } |
解析:定义了两个指针节点 分别是 Node<T> fastTemp = head, lowTemp = head;
分别都是从head 开始 移动。那么下一次项目的时候,则是快指针走了两圈,慢指针走了一圈,所一下次相遇在原地位置。
接下来的问题就是我们在设计快慢指针的时候,是否必须是2倍速速的快慢指针。
如图所示:

假设: 快慢指针在C点相遇,那么相遇点在离循环点B之间是x 那么头节点A离B的距离为 k
在相遇的时候
慢指针:K + X + n*(X+Y) = m; ①
X+Y 绕环一圈的距离;n 慢指针 总共绕了几圈在环内
快指针:
快指针是慢指针 速度的2倍,当它们相遇时 所用的时间是一样的。那么快指针 走过得距离是2*m;
K+X +N*(X+Y) = 2*m; ②
N为快指针绕过得圈数
将 ② - ① 得到下面公式
(N-n)*(X+Y) = m;
接下将 ① 代入 上式得到
(N-n)*(X+Y) = K+X+n*(X+Y);
这里X+Y 环长是个定值。 假设环长为M
(N-n)*M = K+X+n*M; ---- > 得出变形得到 K+X = (N-2*n)*M ;
公式 :K+X = (N-2*n)*M
由于我们设计的是O型循环链表,那么 起始就是循环点B上,则(N-2*n)*M = 0。
N = 2*n; 相遇时 快慢指针所绕 环的圈数 前者是后者的2倍,所用时间相同。这里跟环有多少节点没有关系。
上海尚学堂java培训原作,陆续有数据机构等等java技术文章奉上,请多关注!
下面看一个例子:
给定一个未知的长度的单向环形链表,如何确定链表中间位置的节点元素?
我们也可以使用“快慢指针”来实现,当快指针走一圈,然后停止,那么慢指针的位置则是,中间元素的位置。此时的 时间复杂O(n) = 1/2 n
java数据结构面试问题—快慢指针问题的更多相关文章
- 美团Java实习面试经历(拿到Offer)
美团我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会.10月23日中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我 ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- Java高级工程师面试宝典
Java高级工程师面试宝典 JavaSE 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...
- java技术面试之面试题大全
转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- java 数据结构 图
以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
随机推荐
- .Net代码控制PrivateBinPath和ConfigurationFile的位置
.Net的WinForm程序有的时候让人很烦的是,在执行目录下总是一大堆的DLL,配置文件,最少则是个以下,多的时候怕有四五十个吧……,自己程序中的类库,第三方的类库……加载一起让人感觉乱糟糟的,非常 ...
- vue如何使用rules对表单字段进行校验
基于element-ui 1.在代码中,添加属性::rule <el-form :model="form" :rules="rules" ref=&quo ...
- Top值
业务开发中经常会用到元素或者浏览器窗口的各种top值,最近开发组件的过程中也遇到各种问题,因此决定好好总结一下. 常见的top值 scrollTop Element.scrollTop 属性可以获取或 ...
- ElasticSearch聚合(转)
ES之五:ElasticSearch聚合 前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提 ...
- openstack系列文章(2)dashboard
玩转dashboard之前,考虑一些事情:(1)安全问题:网络访问策略(2)镜像的密码管理:windows或者linux,root或者administrator密码怎么管理(3)怎样创建自己的镜像:w ...
- C51汇编典型代码&一些org-mode技巧
C51汇编典型代码&一些org-mode技巧 文档存放 具体内容可见存放的数据. 下面主要介绍关键代码. ASM 部分 1;; LCD数据发送========================= ...
- maven 在clean package时,出现:找不到符号 [ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 解决办法
另一个项目中增加了,sqlDdlFilter 在调用的项目中clean package时,出现 找不到符号[ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 原 ...
- short s=1;s=s+1;short s=1;s+=1;有什么区别?
short s = 1; s = s + 1; 这个编译一定是不通过的,会提示损失精度. short s = 1; s += 1: 这个编译反而可以通过. 隐式类型转换可以由小到大自动转,即byte ...
- LoadRunner录制脚本时没有响应——无法启动浏览器问题总结
1.ie浏览器去掉启用第三方浏览器扩展 2.loadrunner11 键盘F4,在browser Emulation点击change,在弹出的提示框中Browser version 选择8.0,pla ...
- 【Python】【BugList13】req = requests.get(url=target)报错: (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)')
[代码] # -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'https://unsplash.co ...