【算法】判断链表中是否有环
时间:2021-09-06
本文章向大家介绍【算法】判断链表中是否有环 ,主要包括【算法】判断链表中是否有环 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
判断链表是否有环,一般的做法是使用快慢指针的方法来判断,今天想给大家介绍另一种更想法奇特的算法——链表破坏法(仅做参考)
前置说明
链表的存储结构如下,主要包括val和next(为了简单就没有把他变成私有变量)
1 public class ListNode { 2 public int val; 3 public ListNode next; 4 public ListNode(int x) { 5 val = x; 6 next = null; 7 } 8 }
快慢指针法
算法说明:
- 设置慢指针slow和快指针fast,初始化都在头结点
- fast指针每次比slow指针多走一步
- 判断,如果快指针快指针为空,那认为到达了链表顶端,那么就没有环
- 判断,如果某一次循环中快指针撞上了慢指针,那么表示形成了闭环(但这并不是环的入口)
优点:
- 保持链表结构。
缺点:
- 仅能判断是否有环,无法同时找到入口节点信息
1 public boolean hasCycle(ListNode head) { 2 ListNode slow = head; 3 ListNode fast = head; 4 while (slow!=null && fast!=null && fast.next!=null){ 5 slow = slow.next; 6 fast = fast.next.next; 7 if (fast == slow){ 8 return true; 9 } 10 } 11 return false; 12 }
链表破坏法
算法说明:
- 遍历链表,将每个节点都指向head节点
- 判断是否当前节点的next已经指向的head节点,如果是,则表示当前节点是环的入口(有环)
- 如果一直都没有2的情况发生,且遇到节点为null,表示达到了节点尾部(无环)
优点:
- 可以快速判断是否有环以及环入口。
缺点:
- 会破坏原始链表结构。
1 public boolean hasCycle(ListNode head) { 2 ListNode node = head; 3 ListNode next = null; 4 while (node!=null) { 5 if (node.next == head) { 6 return true; 7 } 8 next = node.next; 9 node.next = head; 10 node = next; 11 } 12 return false; 13 }
原文地址:https://www.cnblogs.com/zjqq6666/p/15235995.html
- c++/c 获取cpp文件行号跟文件名
- 零基础学编程042:画函数图像
- C-SATS工程副总裁教你如何用TensorFlow分类图像 part2
- C++11 Lambda表达汇总总结
- TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)
- C++虚析构函数解析
- C-SATS工程副总裁教你如何用TensorFlow分类图像 part1
- 帝国cms文章页调用当前文章URL如何操作?
- dedecms文章页调用地址(当前文章URL)如何操作?
- 饭团开通一周,3人学会了比特币操作
- Sample K算法
- C#读取“我的文档”等特殊系统路径及环境变量
- winform CheckedListBox实现全选/全不选
- 机器学习该如何入门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法