博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表算法面试题---环形链表
阅读量:2491 次
发布时间:2019-05-11

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

题目描述

给定一个链表,判断是否有环。

如下图,就是一个环形链表。

在这里插入图片描述

解法1:

你肯定很容易就能想到借助set集合的方式来实现,比如挨个遍历每个节点并放入set集合中,如果当前的节点在set集合中已经存在,则认为是环形链表,否则不是。

public class HasCycle {
public static void main(String[] args) {
ListNode head = new ListNode(1); ListNode n1 = new ListNode(2); ListNode n2 = new ListNode(3); ListNode n3 = new ListNode(4); ListNode n4 = new ListNode(5); ListNode n5 = new ListNode(6); ListNode n6 = new ListNode(7); head.next = n1; n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; n5.next = n6; //环形链表n6下一节点又指回了n2 n6.next = n2; HasCycle c = new HasCycle(); System.out.println(c.hasCycle(head)); } public boolean hasCycle(ListNode head) {
Set
nodeSet = new HashSet<>(); ListNode cur = head; while (cur != null) {
//如果set集合中已经存在当前节点,则调用add方法时会返回false if (!nodeSet.add(cur)) {
return true; } cur = cur.next; } //一直遍历到最后,如果set都没重复添加过,则不是环形链表 return false; }}

进阶要求

请你在O(1)空间复杂度内完成判定,也就是说不能再借助其他数据结构了。

解法2

快慢指针的方式,快指针每次走2步,慢指针每次走1步,如果是环形链表,那么快慢指针必定会相遇,如果不是那么快指针走到底就结束了。结论比较难证明,我们可以通过模拟验证。

假设有如下一个环形链表,我特意把它形象的画成了一个环形,依次按照慢指针走一步,快指针走两步的方式。

第一次

在这里插入图片描述

第二次

在这里插入图片描述

第三次

在这里插入图片描述

第四次

在这里插入图片描述

第五次

在这里插入图片描述

第六次,相遇

在这里插入图片描述

public class HasCycle {
public static void main(String[] args) {
ListNode head = new ListNode(1); ListNode n1 = new ListNode(2); ListNode n2 = new ListNode(3); ListNode n3 = new ListNode(4); ListNode n4 = new ListNode(5); ListNode n5 = new ListNode(6); ListNode n6 = new ListNode(7); head.next = n1; n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; n5.next = n6; //环形链表n6下一节点又指回了n2 n6.next = n2; HasCycle c = new HasCycle(); System.out.println(c.hasCycle(head)); } public boolean hasCycle(ListNode head) {
//准备一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步 ListNode fastNode = head; ListNode slowNode = head; //如果快指针能走到null,则肯定不是环形链表,(环形链表是一个死循环) while (fastNode != null && fastNode.next != null) {
slowNode = slowNode.next; fastNode = fastNode.next.next; //如果相遇,则是环形链表 if (slowNode == fastNode) {
return true; } } return false; }}

转载地址:http://dhlrb.baihongyu.com/

你可能感兴趣的文章
docker容器秒死的解决办法
查看>>
管理网&业务网的一些笔记
查看>>
openstack报错解决一
查看>>
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>
乙未年年终总结
查看>>
子网掩码
查看>>
第一天上班没精神
查看>>
启动eclipse报错:Failed to load the JNI shared library
查看>>
eclipse安装插件的两种方式在线和离线
查看>>
linux下源的相关笔记(suse)
查看>>
linux系统分区文件系统划分札记
查看>>
Linux(SUSE 12)安装Tomcat
查看>>
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>
Overlay之VXLAN架构
查看>>
Eclipse : An error occurred while filtering resources(Maven错误提示)
查看>>
在eclipse上用tomcat部署项目404解决方案
查看>>