数据结构:力扣OJ题(每日一练)

目录

题一:环形链表

思路一:

题二:复制带随机指针的链表

思路一:

本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵!


题一:环形链表

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 )。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改链表。

示例 1:

思路一:

定义快慢指针:slow,fast,slow每次走一步,fast每次走两步 ;假设到环口长度为L,环的周长为C,slow从环口到相遇点为S ,如下图:slow走了:L+S fast走了:2*(L+S);当slow到环口时fast已经走了n圈到相遇时n>=1,所以fast到相遇时走了:L+n*C+S

得出运算式:L = n*C-S ,结论:一个指针从起点走,一个从相遇点走,他们会在入口点相遇。

cpp 复制代码
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    struct ListNode* newnode = head;
    //判断有没有相遇点
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        //找到相遇点
        if(slow == fast)
        {
            struct ListNode* node = slow;
            //分别从起点和相遇点开始走
            while(node != newnode)
            {
                newnode = newnode->next;
                node = node->next;
            }
            return newnode;
        }
    }
    return NULL;
}

题二:复制带随机指针的链表

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝 。 深拷贝应该正好由 n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点

例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 x.random --> y

返回复制链表的头节点。

示例 1:

复制代码
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

思路一:

第一步 :在原链表的每一个之间开辟一块相同空间的copy将val和下一个的地址复制,并改变cur->next=copy;

第二步 :因为每个原链表后面都有一个复制的copy链表所以copy-> randon都可以指向自己复制的randon ;核心: copy=cur-> randon->next

第三步 :将copy链表从原链表head上分离 出来,并将各自的节点接上

cpp 复制代码
struct Node* copyRandomList(struct Node* head) {
	struct Node* cur = head;
    while(cur)
    {
        struct Node* next = cur->next;
        //开辟copy的节点
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        //复制值
        copy->val = cur->val;
        //插入
        copy->next = next;
        cur->next = copy;
        //向后走
        cur = next;
    }
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        if(cur->random != NULL)
        {
            //copy的随机节点指向自己的随机节点
            copy->random = cur->random->next;
        }
        else
        {
            copy->random = NULL;
        }
        cur = copy->next;
    }
    //分离链表
    struct Node* copyhead = NULL;
    struct Node* copytail = NULL;
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        //分离copy链表
        if(copytail == NULL)
        {
            copyhead = copytail = copy;
        }
        else
        {
            copytail->next = copy;
            copytail = copytail->next;
        }
        //恢复原链表
        cur->next = next;
        cur = next;
    }
    return copyhead;
}

本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵!

相关推荐
跟着珅聪学java2 分钟前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
徐小黑ACG1 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
想跑步的小弱鸡3 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
战族狼魂4 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
xyliiiiiL5 小时前
ZGC初步了解
java·jvm·算法
杉之5 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
爱的叹息5 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
Merokes6 小时前
关于Gstreamer+MPP硬件加速推流问题:视频输入video0被占用
c++·音视频·rk3588
hycccccch6 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰6 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法