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

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

DESC1:

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

 

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

 

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0

输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1

输出:false
解释:链表中没有环。

 

提示:

    链表中节点的数目范围是 [0, 104]

    -105 <= Node.val <= 105
    pos 为 -1 或者链表中的一个 有效索引 。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/linked-list-cycle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

CODE1:

JAVA:

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public boolean hasCycle(ListNode head) {        if (head == null) {            return false;        }        ListNode fast = head;        while (fast!=null && fast.next!=null) {            head = head.next;            fast = fast.next.next;            if (head == fast) {                return true;            }        }        return false;    }}

 

 

NOTES1:

  1. 使用快慢指针,如果存在还,两指针肯定会在环中某位置相遇;

 

DESC2:

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

进阶:

    你是否可以使用 O(1) 空间解决此题?

 

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0

输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1

输出:返回 null
解释:链表中没有环。

 

提示:

    链表中节点的数目范围在范围 [0, 104] 内

    -105 <= Node.val <= 105
    pos 的值为 -1 或者链表中的一个有效索引

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/linked-list-cycle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

CODE2:

JAVA:

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode detectCycle(ListNode head) {        if (head == null) {            return null;        }        ListNode slow = head;        ListNode fast = head;        while (fast!=null && fast.next!=null) {            slow = slow.next;            fast = fast.next.next;            if (slow == fast) {                ListNode slowNew = head;                while (fast!=slowNew) {                    slowNew = slowNew.next;                    fast = fast.next;                }                return slowNew;            }        }        return null;    }}

 

 

NOTES2:

  1. 记住一点,当链表有环,快慢指针在环中相遇时,重启一个慢指针从头部一步一步走,快指针也一步一步走,他们最终会在环入口相遇;具体参考leetcode推导,如下:
你可能感兴趣的文章
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>
[互联网关注]李开复教大学生回答如何学好编程
查看>>
[关注大学生]李开复给中国计算机系大学生的7点建议
查看>>
[关注大学生]大学毕业生择业:是当"鸡头"还是"凤尾"?
查看>>
[茶余饭后]10大毕业生必听得歌曲
查看>>
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>