刷题笔记(较难篇)(c实现)(跑路人笔记)---链表1

简介: 刷题笔记(较难篇)(c实现)(跑路人笔记)---链表1

前言

本次题目包括环形链表(力扣简单)

环形链表2(力扣中等)

复制带随机指针的链表(力扣中等)

环形链表

连接

题目描述

image.png

及判断一个单链表内是否带环即可如果带环就返回true不带环就返回false.

我们使用快慢指针来解决这个问题

思路

快慢指针

定义fast和slow,fast一次跳两个节点,slow一次跳一个节点

让fast去追赶slow就好

如果fast先进入环内循环等到slow进入环内后fast如果是带环的就一定可以追上slow如果不带环就通过if判断条件结束进程就好👍

正确代码

bool hasCycle(struct ListNode *head)
{
    if(head==NULL)
    {
        return false;
    }//head为空直接false
    struct ListNode *fast = head->next;
    struct ListNode *slow = head;
    while(fast != slow)
    {
        if(fast==NULL||fast->next==NULL||slow == NULL)
        {
            return false;
        }//检测fast和slow
        fast = fast->next->next;
        slow = slow->next;
    }
    //循环结束后返回true.
    return true;
}

环形链表2

力扣中等(这道题主要是找规律和公式)连接

题目描述

image.png

对上一题进行了升级,我们要找到环形链表的节点.

正确代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    if(head == NULL)
    {
        return NULL;
    }
    struct ListNode *slow = head;
    struct ListNode *fast = head;
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast==slow)
        {
            struct ListNode *meet = slow;
            struct ListNode *start = head;
            while(start!=meet)
            {
                start = start->next;
                meet = meet->next;
            }
            return meet;
        } 
    }
    return NULL;
}

思路讲解

步骤


首先判空

通过快慢指针来判断是否为带环链表

追赶上就进入if条件句内

if条件内通过fast的速度是slow的二倍推出的距离相同得出代码即可得出meet(主要讲解)

前三步不需要讲,都在代码里了.

第四步讲一下如何推断的距离相同以及那两段的距离相同👍

开始:

首先我们需要表达出fast和slow各自走的路程大小(画图理解较好)—分两种情况

我直接将两种情况融合成为一种情况好了🤪


情况一在slow进圈前fast一直在转圈转了n圈

情况二在slow进圈前fast没有转圈也就是fast只转了2圈👍


情况一包括了情况二,情况二只是情况只是情况一的特殊情况而已👍.

(没想到我也能跟别人讲数学知识=-=明明只是数学渣渣)


我们就讲情况一好了😜.

通过图来讲 好一些.

(注:下图是fast已经追赶上slow的情况)


image.png


(舒文的闲话: 至于为啥要以fast和slow相遇时的情况作图讲解其实也很简单,因为我们就只能得到fast和slow相遇时的情况😜.)


我们先来找他们的关系式吧.


slow作为慢指针它一定是不会转两圈及以上的因为fast会追上它

而🔆fast如果在slow没进环之前是有可能已经转了n圈🔆了

我们再通过fast走的路程是slow的二倍即可得到一下表达式

2L+2X = L+X+nC

移动一下可以得到以下式子

L = nC-X.

我们让一个变量从头走,让另一个变量从fast和slow相遇的地方走,当他俩相同时我们就得到了交点👍.

这也是我代码所实现的

struct ListNode *meet = slow;
            struct ListNode *start = head;
            while(start!=meet)
            {
                start = start->next;
                meet = meet->next;
            }
            return meet;


代码思想不难主要是公式的推导.希望大家可以看懂😜.


相关文章
|
8天前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
5天前
|
Java C++ Python
链表刷题集
链表刷题集
|
29天前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
30 1
|
8天前
|
存储 算法 Linux
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
|
18天前
|
存储 算法
力扣链表刷题总结(简单)
力扣链表刷题总结(简单)
|
29天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
21 0
|
29天前
|
索引
【力扣刷题】回文链表、环形链表、合并两个有序链表
【力扣刷题】回文链表、环形链表、合并两个有序链表
21 0
|
15天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
15天前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表