网络知识 娱乐 【数据结构】(图解)leetcode刷题之单链表(下)

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

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

文章目录

    • 往期系列
  • 环形链表
    • 延伸问题
      • 为什么slow和fast会在环中相遇?
      • 为什么让slow走一步,fast走两步呢?
  • 复制带随机指针的链表

在这里插入图片描述

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

往期系列

【数据结构】(图解)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;

}