当前位置:网站首页>笔试面试题目:判断单链表是否有环
笔试面试题目:判断单链表是否有环
2020-11-08 10:30:00 【osc_ezb5qfcz】
原文发表于:
之前在U公司的笔试中,碰到这样一个问题:
判断单链表是否有环。
首先来看这样一个常识:现实中的环路与单链表的环路,有什么不同呢?
显然:现实中的环路,可以有两个方向,要么循环,要么逃出。然而,在单链表中,指针next只可能有一个指向,所以环路链表必定永远循环,没有出口。如下图所示:
回到问题本身,怎么判断单链表是否有环呢?
算法1:标记法
最容易想到的肯定是标记法。遍历链表时,对访问过的结点做记录。如果是环状单链表,则必然有结点被重复访问。这种思路是非常自然的。
做标记时,可考虑用hash map或者hash set, 需要耗费一些空间。由于思路比较明确,所以就没有必要详细介绍程序了。
算法2:暴力算法
暴力,也是解决问题的一种思路,尽管不一定是最好的方式。
可以这么考虑:一路走到黑,如果到了终点,则没有环,如果没有到达终点,则说明在环中不停绕圈。
我刚才在leetcode上做了一下这个题目,用的是暴力法,能通过所有测试用例,代码如下:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func hasCycle(head *ListNode) bool {
count := 0
max := 12000
for ; head != nil && count < max; {
count++
head = head.Next
}
if count == max {
return true
}
return false
}
一看就知道,这种暴力算法是有局限性的:比如,如果链表足够长,也会导致count和max相等,可能会误判的。
算法3:快慢指针
摩托车在后,自行车在前,摩托车追赶自行车,如果是一个没有出路的环形路,那么摩托车必然会追上自行车。
所以,我们可以采用类似思路,让快指针在后,慢指针在前,可以判断单链表是否带环。这种方法的好处是,空间复杂度是O(1),且不会出现误判。
既然知道了思路,写程序就是很简单的事情了,故不再赘述。
周末愉快,下周再聊,不见不散。
版权声明
本文为[osc_ezb5qfcz]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4309139/blog/4707995
边栏推荐
- 211考研失败后,熬夜了两个月拿下字节offer!【面经分享】
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
- Adobe Prelude /Pl 2020软件安装包(附安装教程)
- 成功解决An error ocurred while starting the kernel
- 【原创】关于高版本poi autoSizeColumn方法异常的情况
- Astra: Apache Cassandra的未来是云原生
- Japan PSE certification
- [summary series] technical system of Internet server: high performance database index
- 解决RabbitMQ消息丢失与重复消费问题
- Face recognition: attack types and anti spoofing techniques
猜你喜欢
墨者学院SQL注入解题
PCIe 枚举过程
python 循环区分(while循环和for循环)
5g + Ar out of the circle, China Mobile Migu becomes the whole process strategic partner of the 33rd China Film Golden Rooster Award
How can a technician take over a complex system?
年轻一代 winner 的程序人生,改变世界的起点藏在身边
推荐一部经济科普视频,很有价值!
413【毕设课设】基于51单片机无线zigbee无线智能家居光照温湿度传输监测系统
Recommend an economic science video, very valuable!
蓝牙2.4G产品日本MIC认证的测试要求
随机推荐
5g/4g工业无线路由器
[original] about the abnormal situation of high version poi autosizecolumn method
2天,利用下班后的4小时开发一个测试工具
vivoS7e和vivoS7的区别 哪个更值得入手
PCIe enumeration process
Cloud Alibabab笔记问世,全网详解仅此一份手慢无
Python loop distinction (while loop and for loop)
Close to the double 11, he made up for two months and successfully took the offer from a large factory and transferred to Alibaba
Rust: command line parameter and environment variable operation
函数周期表丨筛选丨值丨SELECTEDVALUE - 知乎
2020-11-05
虚拟机中安装 macOS 11 big sur
年轻一代 winner 的程序人生,改变世界的起点藏在身边
SQL Server 2008R2 18456 error resolution
Flink's sink: a preliminary study
解决RabbitMQ消息丢失与重复消费问题
维图PDMS切图软件
游戏优化性能杂谈(十一) - 知乎
[summary series] technical system of Internet server: high performance database index
计算机网络基本概念(五)局域网基本原理