`
brandNewUser
  • 浏览: 459820 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单向链表的闭环判断

 
阅读更多

单向链表,只能访问next元素,如何判断是否存在环?

 

最简单的方案,不考虑空间复杂度,我们会想到使用一个Set来保存集合,用来记录已经访问过的元素

/**
     * 最简单的算法,但需要的空间比较高,一个Set集合
     * @param link
     * @param <T>
     * @return
     */
    public static <T>  boolean containsCircle1(Link<T> link) {
        if(link == null){
            return false;
        }
        T value = link.getValue();
        Set<T> values = new HashSet<T>();
        values.add(value);
        while ((link = link.getNext()) != null){
            if(link == null){
                return false;
            }
            value = link.getValue();
            if (values.contains(value)) {
                return true;
            }
        }
        return false;
    }

 

 

这会浪费O(n)的空间,效率低下,如果链表长度过长,占用的空间会非常大,考虑一下有无其他简便的方法?

 

使用两个指针,分别以不同的速度向前遍历,一个以单个元素为步长,另一个以两个元素为步长,如果两个元素步长的指针追上了后面的指针,这便证明该链表中存在环。这样,只需要额外的两个空间,空间复杂度为O(1)

 

/**
     * 使用两个指针,一个以速度1前进,另一个以速度2前进,如果存在闭环,则必定会出现交叉碰面
     * @param link
     * @param <T>
     * @return
     */
    public static <T> boolean containsCircle2(Link<T> link) {
        if (link == null || link.getNext() == null) {
            return false;
        }
        Link<T> first = link;
        Link<T> second = link.getNext();
        while (second != null && second.getNext() != null && second.getNext().getNext() != null) {
            first = first.getNext();
            second = second.getNext().getNext();
            if (first.getValue() == second.getValue()) {
                return true;
            }
        }
        return false;
    }

 

 

 

分享到:
评论

相关推荐

    数据结构:单向循环链表源码

    3. **插入和删除操作**:插入和删除节点的操作与普通单向链表类似,但需要考虑链表是否为空及插入位置的判断。 **单向循环链表常见操作** 1. **创建链表**:初始化链表,通常创建一个节点作为链表的首节点。 2. **...

    利用单向循环链表存储结构模拟约瑟夫问题,按照出列的顺序印出每个人的编号。

    循环链表没有头节点,最后一个节点的指针会指向第一个节点,形成一个闭环。这使得在环中遍历变得简单,适合模拟约瑟夫问题的循环特性。 在【概要设计】部分,我们看到问题被划分为三个模块:主程序模块、类单元模块...

    循环链表 数据结构

    相较于普通链表,循环链表在末尾节点指向头节点,形成一个闭环,这一特性使其在某些操作上更为便捷,如遍历整个链表、实现循环队列等。 ### 循环链表的数据结构 循环链表由一系列节点组成,每个节点包含两部分:...

    约瑟夫环单循环链表C语言实现

    单向循环链表是一种特殊的线性表存储结构,其中每个节点包含一个指向下一个节点的指针,最后一个节点的指针指向链表的头节点,形成一个闭环。在约瑟夫环问题中,单向循环链表非常适合模拟游戏参与者围成一圈的情形。...

    C语言链表相关面试题.zip

    链表的种类主要有单向链表、双向链表和循环链表。单向链表中的节点只包含一个指向下一个节点的指针;双向链表中的节点包含两个指针,一个指向前一个节点,另一个指向下一个节点;循环链表则是首尾相接的链表,形成一...

    链表概述:结构、类型及基本操作

    链表的主要类型包括单向链表、双向链表和循环链表。在单向链表中,每个节点只有一个指针,指向下一个节点,形成单向链接;双向链表的每个节点则有两个指针,分别指向前一个节点和后一个节点,形成双向链接;循环链表...

    Python实现的单向循环链表功能示例

    与普通的单向链表不同,单向循环链表中的最后一个节点不是指向`None`,而是指向链表的第一个节点(即头节点),形成一个闭环。 ### 原理介绍 在单向循环链表中,每个节点包含两部分:数据域(用于存储实际数据)和...

    有头循环双向链表-链表

    链表的类型多样,根据节点间链接的方向和结构的不同,可以分为单向链表、双向链表以及循环链表等。本文将重点讨论有头循环双向链表这一特殊链表结构。 有头循环双向链表是一种链表结构,其特点是在双向链表的基础上...

    链表-数据结构之链表(Python语言描述)链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点

    链表分为多种类型,如单向链表、双向链表和循环链表。在单向链表中,每个节点只有单一方向的指针,指向下一个节点;双向链表每个节点则包含指向前一个节点和下一个节点的指针,允许双向遍历;循环链表的最后一个节点...

    数据结构中链表及常见操作.docx

    单向链表是最简单的链表形式,它由多个节点组成,每个节点包含两部分:数据域和指针域。数据域用于存储实际数据,而指针域则用于存储指向下一个节点的地址。这种结构只能从前向后遍历。 在单向链表中,节点的结构...

    面试题集之C和C++版本

    循环链表是一种特殊的链表结构,其中最后一个节点的`next`指针指向链表的头节点,形成闭环。在实现循环链表时,通常会维护一个指向链表头部的指针,以便遍历整个链表。 ### 14. switch语句的参数类型限制 `switch`...

    【课件】2.3.4_循环链表.pdf

    而循环链表则需要通过其他方式判断遍历是否完成,如设置一个标志位或记录遍历过的节点数量等。 3. **插入和删除操作**:虽然循环链表与普通链表的插入和删除操作基本类似,但在处理循环特性时需要额外注意更新尾结点...

    带头双向循环链表C语言实现源代码.zip

    与单向链表不同,双向链表可以向前和向后遍历;而“循环”意味着链表的最后一个节点不是指向空,而是指向链表的第一个节点,形成一个闭环。 C语言是一种广泛使用的编程语言,它提供了丰富的指针操作和内存管理功能...

    [详细完整版]链表数据结构.pdf

    - 特点:除了单向链表的下一个节点指针外,每个节点还包含一个指向前一个节点的指针。 - 访问方式:可以在链表中双向移动,既可以从头部向尾部遍历,也可以从尾部向头部遍历。 - 应用场景:适合于需要频繁进行...

    Python实现循环链表数据结构(包含详细的完整的程序和数据)

    循环链表是一种链表数据结构,其特点是链表的最后一个节点通过指针连接到第一个节点,形成一个闭环。这种结构特别适合于需要不断循环访问元素的场景,如解决约瑟夫问题和实现循环队列等。循环链表分为单向和双向两种...

    约瑟夫环代码,建立一个具有n个链结点的循环链表。

    单向循环链表是一种特殊的数据结构,每个节点包含一个指向下一个节点的指针,最后一个节点的指针指向头节点,形成闭环。 #### 三、代码解析 1. **数据结构定义**: ```c typedef struct node { int num; // ...

    实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划)视频

    链表根据结构不同分为单向链表、双向链表和循环链表等。 **2. 单向链表操作** - **创建链表**: 初始化一个头结点,然后通过节点插入操作来构建链表。 - **节点插入**: 在指定位置插入新节点。 - **节点删除**: 删除...

    C语言进阶-第五讲 数据结构与链表

    单向链表是最简单的链表形式,其中每个节点包含一个数据部分和一个指向下一个节点的指针。 #### 双向链表 双向链表中的每个节点除了包含指向下一个节点的指针外,还有一个指向前一个节点的指针。这使得双向链表...

    CDoubleNodeTreate.rar

    这与单向链表不同,单向链表的节点只有一个指针,只指向下一个节点。双向链表的这种特性使得在链表中的前后移动更加灵活,但同时也增加了存储空间的需求。 1. **创建双向链表**:创建双向链表通常从一个空的头节点...

Global site tag (gtag.js) - Google Analytics