【数据结构】(图解)leetcode刷题之单链表(下)

👋大家好呀!这个是付青云同学的博客
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁

在这里插入图片描述

最近在学数据结构,学了的知识后当然要巩固一下,所以就找了一些经典的链表题写一写,同时也分享一下我做题的一些思路。
#另外:这个系列文章将会有上中下三部分,难度递增

往期系列

【数据结构】(图解)leetcode刷题之单链表(上)
【数据结构】(图解)leetcode刷题之单链表(中)

环形链表

题目描述如下(具体可以点击上方链接):
在这里插入图片描述
思路:
使用追及法,定义快慢指针(fast,slow),fast指针每次走两步,slow指针每次走一步,如果这个链表是环形链表则两指针一定会相遇。
代码如下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast,*slow;
    slow=fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

延伸问题

这里我就不证明了,大家可以自己思考思考🐸

为什么slow和fast会在环中相遇?

为什么让slow走一步,fast走两步呢?

复制带随机指针的链表

题目描述如下(具体可以点击上方链接):
在这里插入图片描述
思路:

  1. 首先,我们要向内存申请空间,插在原节点之间。
    就像这样:
    在这里插入图片描述
  2. 这个时候我们就要确定random,直接看图吧:
    请添加图片描述
  3. 当新链表中的random确定后,就是将它从原链表中分离了,然后拼接成一个新链表
    代码如下:
struct Node* copyRandomList(struct Node* head) 
{
    struct Node* cur=head;  
    struct Node* copy;
    while(cur)
    { 
         //1、复制val
        copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
        //2、插入
        copy->next=cur->next;
        cur->next=copy;

        cur=copy->next;
    }
    //3、放random
    cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=copy->next;
    }
    //4、断开
    struct Node* copyHead,*copyTail;
    copyHead=copyTail=NULL;
    cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* next=copy->next;
        if(copyTail==NULL)
        {
           copyHead=copyTail=copy;
        }
        else
        {
            copyTail->next=copy;
            copyTail=copy;
        }
        cur->next=next;
        cur=next;
    }
    return copyHead;

}

 

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付青云同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值