题目:

判断给出的链表中是否存在环。

思路:

1. 遍历整个链表,将走过的节点的内存地址保存下来,如果再次走到同样的内存地址,说明链表中有环。时间复杂度为O(n)。

2. 设置两个指针,fast指针每次走两步,slow指针每次走一步,

如果链表中有环:

当两个指针都进入环中后,他们将在n次移动后相遇

n = 两只指针之间的距离÷两指针的步速差

如果链表中没有换的话,走的较快的fast指针将会率先链表的尾部。

代码:

import java.util.*;
import java.math.*; /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/ class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
} class Solution {
/* //HashSet方法
public boolean hasCycle(ListNode head) {
Set<ListNode> ListNodeSet = new HashSet<>();
while(head != null){
if(ListNodeSet.contains(head)){
return true;
}
ListNodeSet.add(head);
head = head.next;
}
return false;
}*/
//双指针方法
public boolean hasCycle(ListNode head) {
if(head==null || head.next==null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast){
if(fast.next==null || fast.next.next==null){
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
} public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
Solution solution = new Solution();
ListNode list1 = new ListNode(1);
ListNode list2 = new ListNode(1);
list1.next = list2; ListNode list3 = new ListNode(2);
list2.next = list3;
ListNode list4 = new ListNode(3);
list3.next = list4;
ListNode list5 = new ListNode(3);
list4.next = list5;
list5.next = list5; System.out.println(solution.hasCycle(list1)); }
}

LeetCode141 环形链表(Java—HashSet简单应用or双指针)的更多相关文章

  1. [Java]LeetCode141. 环形链表 | Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  2. LeetCode141.环形链表

    给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? /** * Definition for singly-linked list. * class ListNode { * i ...

  3. java 环形链表实现约瑟夫(Joseph)问题

    约瑟夫问题又名丢手绢问题.相传著名犹太历史学家 Josephus 利用其规则躲过了一场自杀游戏,而后投降了罗马. 问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.* 从编号为 ...

  4. 【java基础 12】HashMap中是如何形成环形链表的?

    导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...

  5. 图解Java数据结构之环形链表

    本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...

  6. 丢手帕问题(环形链表)---Java 待优化

    /** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...

  7. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

    1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...

  8. Java实现 LeetCode 142 环形链表 II(二)

    142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...

  9. Java实现 LeetCode 141 环形链表

    141. 环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

随机推荐

  1. 认识gets&read(buffer over flow is bof)

    gets不会检查输入的长度,从而有数据覆盖的风险,

  2. [CEOI 2004]锯木厂选址

    Description 题库链接 从山顶上到山底下沿着一条直线种植了 \(n\) 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个 ...

  3. MCM(矩阵链乘法)

    这是<算法导论>动态规划中的一个问题.问题简述如下:我们在求解矩阵相乘时通常会有一个最优括号方案来对矩阵进行顺序相乘,这样会减少大量的计算时间. 我们知道矩阵A.B相乘,只能是当矩阵A的列 ...

  4. 设计模式课程 设计模式精讲 9-2 原型模式coding

    1 课堂演练 1.1 super.toString 作用 1.2 为什么要使用克隆方法呢 2 代码解析 2.1 代码解析1(使用原型模式之前) 2.2 代码解析2(使用原型模式默认方式(浅克隆)) 2 ...

  5. Spring之IOC、AOP和事务

    IOC 什么是IOC?如果你回答:Spring是个IOC容器,实现原理是反射,没了.这样证明你没有真正理解IOC. IOC的意思是控制反转,还有个外号叫依赖注入(DI).为什么起这么晦涩难懂的名字呢? ...

  6. SVN commit,update用法

    https://blog.csdn.net/studyvcmfc/article/details/4528896

  7. 三 基于Java动态数组手写队列

    手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:除了屏幕阅读器外,其他设备上隐藏元素

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. (二)Buildroot介绍

    详情请参考: http://www.buildroot.org/downloads/manual/manual.html 参考博客: https://www.cnblogs.com/arnoldlu/ ...

  10. 如何安装第三方模块#Python

    从书上看到用pip install XXX 就可以直接安装模块.下面就是具体操作 1.添加环境变量D:\Python\Scripts\pip.exe 2.打开cmd切换到python安装目录 3.pi ...