【数据结构】经典单链表OJ题!!

学习完单链表,习题就成了最好的巩固方式

目录

  • 1.链表分割:
    • 思路:
    • 代码实现:
  • 2.随机链表的复制:
    • 思路1:
    • 代码实现:
    • 思路2:
    • 代码实现:
  • 3.环形链表:
    • 3.1环形链表1:
      • 思路:
      • 代码实现:
    • 3.2环形链表2:
      • 思路:
      • 代码实现:

1.链表分割:

在这里插入图片描述
链表分割,链接奉上

思路:

我们可以创建两个newhead
将比x小的尾插放到newhead1
x大的放在newhead2
再将两个链表进行链接

注意:

  • 在进行创建新的链表时,最好使用带有哨兵位的链表,在进行链接时会比较容易,
    因为没有哨兵位的链表需要判断是否两个链表是否为空,并分别做出处理措施

  • 在尾插时,有可能出现如下图的情况在这里插入图片描述
    故我们需要将tail2->next = NULL

代码实现:

class Partition {
public:ListNode* partition(ListNode* pHead, int val) {//两个哨兵位的创建struct ListNode* newhead1 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* newhead2 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* tail1 = newhead1;struct ListNode* tail2 = newhead2;tail1->next = newhead1->next = NULL;tail2->next = newhead2->next = NULL;while(pHead){if(pHead->val < val){tail1->next = pHead;tail1 = tail1->next;}else{tail2->next = pHead;tail2 = tail2->next;}pHead = pHead->next;}tail1->next = newhead2->next;tail2->next = NULL;return newhead1->next;}
};

2.随机链表的复制:

在这里插入图片描述
链接奉上

思路1:

先复制一份没有进行random处理的copy链表
我们可以根据random的指向的位置原位置
通过计算得出他们之间的距离,
再根据距离进行确定copy链表中random的位置
这样实现,时间复杂度是O(N^2)

代码实现:

理论存在,实践开始

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
struct Node* creat(int x)
{struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));newnode->val = x;newnode->next = NULL;return newnode;
}struct Node* copyRandomList(struct Node* head) 
{struct Node* cur = head;struct Node* newhead = NULL;struct Node* tail = NULL;while(cur){if(newhead == NULL){newhead = creat(cur->val);tail = newhead;}else{tail->next = creat(cur->val);tail = tail->next;}cur = cur->next;}int count = 0;cur = head;struct Node* subcur = newhead;while(cur){count = 0;struct Node* tmp1 = head;while(cur->random != tmp1){count++;tmp1 = tmp1->next;}struct Node* tmp = newhead;while(count--){tmp = tmp->next;}subcur->random = tmp;cur = cur->next;subcur = subcur->next;}return newhead;
}

思路2:

在原链表的每一个元素后边插入一个一样元素的copy节点
在这里插入图片描述
之后,我们发现当前节点后的copy节点的random指向当前节点的random的next,仔细咀嚼(可以自己画图感受一下),这句话也是整个代码的核心
最后再将整个链表进行拆解,返回新的结点

代码实现:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) 
{struct Node* cur = head;//添加copy节点while(cur){struct Node* copy = (struct Node*)malloc(sizeof(struct Node));struct Node* next = cur->next;copy->val = cur->val;copy->next = next;cur->next = copy;cur = next;}cur = head;//random的复制while(cur){if(cur->random == NULL){cur->next->random = NULL;}else{cur->next->random = cur->random->next;}cur = cur->next->next;}//解开节点struct Node* newhead = NULL;struct Node* tail = NULL;cur = head;while(cur){struct Node* next = cur->next->next;if(newhead == NULL){newhead = tail = cur->next;}else{tail->next = cur->next;tail = tail->next;}cur = next;}return newhead;
}

3.环形链表:

3.1环形链表1:

在这里插入图片描述
链接奉上

思路:

利用快慢指针,这是解决此问题的最可行办法,
一个走一步,一个走两步,
当有环时,两者都进入环,因为两者固定减少1步,故必然可以相遇,
当没有环时,fast == NULL,或者fast指针->next == NULL

代码实现:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) 
{struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast)return true;}   return false;
}

3.2环形链表2:

在这里插入图片描述
链接奉上

思路:

先输出一个结论:
找到快慢指针相遇的点,设置两个指针,一个从头开始走,一个从相遇点开始走,一次一步,相遇点就是环的开始点,我们返回此指针

在这里插入图片描述

代码实现:

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

若有问题可以及时询问博主

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/174177.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis的特性以及使用场景

分布式发展历程参考 陈佬 http://t.csdnimg.cn/yYtWK 介绍redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个基于客户端-服务器架构的在内存中存储数据的中间件&#xff0c;属于NoSQL的一种。它可以用作数据库、缓存/会话存储以及消息队列。 作为一种内存数…

Apache Airflow (三) :Airflow WebUI操作介绍

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

KB / KiB,MB / MiB,GB / GiB,… 的区别是什么?

GB和GiB&#xff1a;https://www.zhihu.com/question/24601215 1 显存容量指的是显存能够存储的数据量&#xff0c;单位是GB&#xff0c;显存容量越大 按照目前计算机存储来说&#xff0c;还是应该遵循二进制 严格意义上来讲&#xff0c;1 GB (Gigabyte)10^9 KB&#xff0c;而…

Unity随笔:C#运行时

Unity是如何编译运行C#的 &#xff08;1&#xff09;Unity会通过编译器将C#脚本编译成IL指令。 Unity会通过Roslyn来对C#代码进行编译&#xff0c;生成中间IL指令集。 当我们每次修改或者添加新的C#代码文件&#xff0c;Unity界面的右下角会出现短暂的“转圈”现象。这就意味…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令&#xff1a; tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后&#xff0c;不需要任何…

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…

Meta开源支持1000多种语言的文本转语音与语音识别大语言模型

据不完全统计,地球上有超过7000多种语言,而现在的大语言模型仅仅只涉及到了主流的100多种语言。相对全球7000多种语言来讲,这仅仅只是其中的一小部分。如何让全球的人获益,把大语言模型扩展到更多的语言上,一直是大语言模型研究的重点。Meta发布了涵盖 1406 种语言的预训练…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…

Install Docker in Linux

Docker官网链接: https://docs.docker.com/ 1.确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS&#xff0c;安装最新版的docker需要centOS 7以上的系统。 在Docker安装帮助页面查看支持的系统版本。 Docker帮助页面:https://docs…

dameng数据库数据id decimal类型,精度丢失

问题处理 这一次也是精度丢失&#xff0c;但是问题呢还是不一样&#xff0c;这一次所有的id都被加一了&#xff0c;只有id字段被加一&#xff0c;还有的查询查出来封装成对象之后对象的id字段被减一了&#xff0c;数据库id字段使用的decimal&#xff08;20,6&#xff09;&…

接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…