算法编程(八):环形链表

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

写在前面

今天还说难度简单系列题目继续,《环形链表》,从题目一听就是关于链表的一道题,上一题刚送走了一个二叉树数据结构,这次又来了一个链表题目。

大家可以在这道题里面体会体会链表的一些特性和如何处理链表。

image.png

题目解读

从这道题目上来看,我们主要就是要了解链表的基础知识,比如从题目示例上来看,链表是一个首尾可能都会存在链表元素的数据结构。

而且可以存在环形相连的情况,当然这在日常开发中不经常遇到,因为一旦遇到一般都是报错了。

再者就是如何判断一个链表对象是否存在环形结构。

这里一般最暴力的手法就是通过循环遍历,然后通过去重集合或者别的什么,将已经遍历过的元素对象存储下来。

在每次遍历之前先判断是否已经存在对象,如果存在的话,自然也就是存在环形结构的链表了。

代码实现

本次运行的代码如下,此次使用的方法就是通过循环来获取链表的每一个对象值,然后通过Set来存储判断是否存在,效率较差。

/**
 * 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) {
        Set<ListNode> set = new HashSet<>();
        while (head != null) {
            if (!set.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}

执行结果

通过Set来存储ListNode对象,是一个不智之举,但是是一个快速的方法,这思路实现起来非常简单,就是效率不咋地。

image.png

其他思路

暂无,大家有什么想法可以评论区见。

总结

相信关于链表,还是要通过递归、或者循环来解决部分问题的,因为要逐渐递进到最后一个元素才行,所以你搞清了吗?