链表经典面试题之二

今天我们做一道环形链表的题目力扣141题https://leetcode.cn/problems/linked-list-cycle/

这道题让我们分析链表中是否存环,存在的话返回true,不存在返回false。首先看到这道题我们要捋顺思路,怎么才能达到它要的效果?要找出是否存在一个环,那么我们能不能看看尾结点的下一个结点是不是之前出现过的结点呢?我们在仔细想一想,如果有环的话,存在尾结点吗?当然不存在,如果环存在的话,就没有尾结点,都已经叫尾结点了那肯定就是最后一个结点。所以我们不妨改变思路,用快慢双指针的方式做这道题目。

复制代码
struct ListNode *fast=head;
struct ListNode *slow=head;

我们定义fast一次走两步,slow一次走一步,如果有环fast肯定先进环一直在换里面转,当slow进环的时候两个指针距离相差为N,而fast和slow每走一步,距离就减少1,总会存在,距离为0的情况,当fast=slow的时候,存在环,否则不存在;

复制代码
while()
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        return true;
    }
    return false;

但是这个while循环的条件怎么判断呢?什么时候循环停下?fast走的快,当fast走到尾为空的时候停下,有人会有疑问,不是有环的时侯链表没有尾吗?是的,但是我们这个判断是循环停下的条件,如果循环没有进循环时不时就是没有环就直接返回false了呢?

复制代码
while(fast)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        return true;
    }
    return false;

这样就结束了吗?我们运行会发现它报了一个空指针的错误

到底哪里出现空指针了呢?我们想一下当时fast一次走两步,fast=fast->next->next,我们只判断了当fast==NULL的时候循环停止,是不是忽略掉fast->next的时候到空了呢?这个时候,fast->next还能指向next吗?所以,这个循环应该是while(fast&&fast->next)才可以。

复制代码
struct ListNode *fast=head;
struct ListNode *slow=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        return true;
    }
    return false;

当我们这样写完,运行就通过啦

相关推荐
南清的coding日记1 小时前
算法详细讲解- 快速排序与归并排序
数据结构·排序算法
dudly2 小时前
Python 列表内存存储本质:存储差异原因与优化建议
开发语言·数据结构·python·编程语言·内存分析
草莓熊Lotso6 小时前
【数据结构初阶】--二叉树(二)
c语言·数据结构·经验分享·其他
朝朝又沐沐10 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
艾莉丝努力练剑12 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶12 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
设计师小聂!14 小时前
力扣热题100----------53最大子数组和
java·数据结构·算法·leetcode
YouQian77215 小时前
问题 C: 字符串匹配
c语言·数据结构·算法
yanxing.D15 小时前
408——数据结构(第二章 线性表)
数据结构·算法
艾莉丝努力练剑16 小时前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表