当前位置: 首页 > news >正文

单链表算法经典OJ题

目录

1、移除链表元素 

2、翻转链表 

3、合并两个有序链表 

4、获取链表的中间结点 

5、环形链表解决约瑟夫问题 

6、分割链表 


1、移除链表元素 

203. 移除链表元素 - 力扣(LeetCode)

typedef struct ListNode LSNode;
struct ListNode* removeElements(struct ListNode* head, int val){LSNode* newHead,*newTail;//令头结点和尾结点都置为空newHead = newTail = NULL;//令新指针pcur指向原链表的头结点head,遍历原链表LSNode* pcur = head;while(pcur){//当不满足.val==val时,开始向新建的空链表中插入if(pcur->val != val){//1、如果新建的链表为空,插入的新节点就是链表的头结点和尾结点if(newHead == NULL){newHead = newTail = pcur;}//2、如果新建的链表不为空,直接尾插,让新插进来的结点作为新的尾结点else{newTail->next = pcur;newTail = newTail->next;//令newTail移位}}//当满足pcru->val = val,直接跳过进行下一个读取即可pcur = pcur->next;}//当pcur指向存储整数6的结点时,pcur满足pcur.val = val不会进入if,直接执行pcur = pcur->next,此时pcur = NULL//pcur为NULL,跳出while循环,如果此时直接返回newHead那么新链表的newTail->next指向的位置仍是旧链表存储数据6//的结点,所以此时需要再判断newTail是否为空,如果不为空则让它最后指向的方向置为空,最后再返回头结点if(newTail)newTail->next = NULL;return newHead;
}

2、翻转链表 

 206. 反转链表 - 力扣(LeetCode)

typedef struct ListNode LSNode;
struct ListNode* reverseList(struct ListNode* head)
{//如果传入的链表为空的时候直接返回NULLif(head == NULL){return NULL;}LSNode* n1,*n2,*n3;n1 = NULL; n2 = head;n3 = head->next;while(n2){n2->next = n1;n1 = n2;//当n3为空时已经将n3的值交给n2n2 = n3;//当n3所处的位置不为空时才能接着移动n3,否则结束一次while循环if(n3)n3 = n3->next;}//此时n1为链表的头return n1;
}

3、合并两个有序链表 

 21. 合并两个有序链表 - 力扣(LeetCode)

typedef struct ListNode LSNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{//当传入的两个链表其中有一个为空,那么返回另一个链表即可if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}//当两个链表都不为空时,遍历链表LSNode* cur1 = list1;LSNode* cur2 = list2;//创建新的空链表--带头(结点)单向不循环链表(后续进行尾插等情况就不需要考虑头结点是否为空的情况,减少重复代码)LSNode* newHead,*newTail;//malloc创建一个内存空间,该空间不含有效数据,刚好用于存放该链表的头结点(头结点的有空间但是不存储有效数据)newHead = newTail = (LSNode*)malloc(sizeof(LSNode));//当两个结点有一个走到空就不能进行比较了while(cur1 && cur2){//把值小的结点尾插到新的链表if(cur1->val < cur2->val){newTail->next = cur1;newTail = newTail->next;cur1 = cur1->next;}//当cur2->val <= cur1->val时else{newTail->next = cur2;newTail = newTail->next;cur2 = cur2->next;}}
if(cur1)newTail->next = cur1;
if(cur2)newTail->next = cur2;
return newHead->next;
}

4、获取链表的中间结点 

876. 链表的中间结点 - 力扣(LeetCode)

typedef struct ListNode LSNode;
struct ListNode* middleNode(struct ListNode* head)
{   if(head == NULL)return NULL;//快慢指针LSNode* slow,*fast;slow = fast = head;//只要fast和fast->next有一个为空则停止循环//因为我们也不知道链表的结点数是奇数还是偶数while(fast && fast->next)//注意二者判断顺序不能交换,因为如果链表结点数为偶数时最后一次循环 //fast指向的位置刚好空,下次循环前判断时,由于fast以及指向空了,更别提fast->next了//虽然此时slow指向了我们想要的位置但是由于fast->next本身就不合理程序就会报错//当然如果是奇数个就可以交换{slow = slow->next;fast = fast->next->next;}//当循环结束时,slow必定指向我们要找的链表中间结点return slow;
}

5、环形链表解决约瑟夫问题 

环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)

#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode ListNode;//申请链表结点函数,同时为结点中添加数据x
ListNode* ListByNode(int x)
{ListNode* node = (ListNode*)malloc(sizeof(ListNode));if(node == NULL){perror("malloc fail!");exit(1);}node->val = x;node->next = NULL;return node;
}//创建带环链表
ListNode* CreateList(int n)
{ListNode* phead = ListByNode(1);ListNode* pTail = phead;for(int i = 2;i<=n;i++){ListNode* node = ListByNode(i);pTail->next = node;pTail = pTail->next;}//以上只是在创建单链表,想要让链表成环,需要将尾结点和头结点相连pTail->next = phead;//这里直接返回尾结点因为有尾结点就能直接找到头结点,返回头结点的话还需要遍历链表才能找到尾结点return pTail;
}//实现函数
int ysf(int n, int m ) {//创建不带头单向循环链表ListNode* prev = CreateList(n);//进行游戏逻辑实现ListNode* cur = prev->next;//就是头结点int count = 1;while (cur->next != cur) {if(count == m){//删除结点prev->next = cur->next;free(cur);cur = prev->next;count = 1;//人死后记得让下一个人从1开始报数(count重置为初始值1)}else {//继续向下报数prev = cur;cur = cur->next;count++;}}//此时链表中只剩下一个结点,返回该结点中的数return cur->val;
}

6、分割链表 

面试题 02.04. 分割链表 - 力扣(LeetCode) 

typedef struct ListNode ListNode; 
struct ListNode* partition(struct ListNode* head, int x)
{if(head == NULL)return head;//创建带头的大小链表ListNode* lessHead,*lessTail;ListNode* greatHead,*greatTail;//创建大小链表的哨兵位lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));greatHead = greatTail = (ListNode*)malloc(sizeof(ListNode));//遍历原链表,将结点放到大小链表中ListNode* cur = head;//当cur读取原链表后循环结束while(cur){   //放入小链表if(cur->val < x){lessTail->next = cur;lessTail = lessTail->next;}//放入大链表else{greatTail->next = cur;greatTail = greatTail->next;}cur = cur->next;  //cur向后走}//原链表循环结束此时greatTail后指向的内容并未被置空所以要判断if(greatTail)greatTail->next = NULL;//小链表的尾和大链表的哨兵位的下一个结点连接起来lessTail->next = greatHead->next;return lessHead->next;
}

~over~ 

相关文章:

单链表算法经典OJ题

目录 1、移除链表元素 2、翻转链表 3、合并两个有序链表 4、获取链表的中间结点 5、环形链表解决约瑟夫问题 6、分割链表 1、移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; typedef struct ListNode LSNode; struct ListNode* remove…...

Picnic master project interview

picnic Picnic master project interview1. Topics1.1 Systematically identify similar/interchangeable articles1.2 Understanding changing customer behaviour 2. interview等后续 Picnic master project interview 1. Topics 1.1 Systematically identify similar/inte…...

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目&#xff0c;访问路径加前缀分为两部分&#xff1a; &#xff08;1&#xff09;修改vue项目&#xff1b; &#xff08;2&#xff09;修改nginx配置&#xff1b; vue项目修改 需注意&#xff0c;我这是vue-cli3配置&#x…...

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…...

【扩散模型】如何用最几毛钱生成壁纸

通过学习扩散模型了解到了统计学的美好&#xff0c;然后顺便记录下我之前文生图的基础流程~ 扩散模型简介 这次是在DataWhale的组队学习里学习的&#xff0c;HuggingFace开放扩散模型学习地址 扩散模型训练时通过对原图增加高斯噪声&#xff0c;在推理时通过降噪来得到原图&…...

零基础Linux_17(进程间通信)VSCode环境安装+进程间通信介绍+pipe管道mkfifo

目录 1. VSCode环境安装 1.1 使用VSCode 1.2 远程链接到Linux机器 1.3 VSCode调试 2. 进程间通讯介绍 2.1 进程间通讯的概念和意义 2.2 进程间通讯的策略和本质 3. 管道 3.1 管道介绍 3.2 匿名管道介绍 3.3 匿名管道示例代码 3.3.1 建立管道的pipe 3.3.2 匿名管道…...

Redis的BitMap使用

Redis的BitMap使用 Redis 为我们提供了位图这一数据结构&#xff0c;每个用户每天的登录记录只占据一位&#xff0c;365天就是365位&#xff0c;仅仅需要46字节就可存储&#xff0c;极大地节约了存储空间。 位图不是实际的数据类型&#xff0c;而是一组面向位的操作 在被视为…...

java并发编程之基础与原理1

java多线程基础 下面说一下线程的7种状态 下面我重点来说一下阻塞状态 阻塞状态是可以分很多种的&#xff1a; 下面用另外一张图来说明这种状态 简单说一下线程的启动原理 下面说一下java中的线程 java线程的异步请求方式 上面就会先把main执行出来&#xff0c;等阻塞结束之后…...

⟨A⟩ = Tr(ρA) 从数学上来讲什么意思

当给定一个具体的密度矩阵ρ和一个可观测量A时&#xff0c;我们可以通过数值计算来演示〈A〉 Tr(ρA) 的应用。 假设我们有以下密度矩阵和可观测量&#xff1a; ρ [0.6 0.3; 0.3 0.4] A [1 0; 0 -1] 我们首先计算ρA的乘积&#xff1a; ρA [0.6 0.3; 0.3 0.4] * [1 0…...

Vue中的v-model指令的原理是什么?

在Vue中&#xff0c;v-model是一个双向绑定指令&#xff0c;它的原理是将表单元素的值与Vue实例中的数据属性进行双向绑定。当表单元素的值发生变化时&#xff0c;会自动更新Vue实例中对应的数据属性&#xff1b;反之&#xff0c;当Vue实例中的数据属性发生变化时&#xff0c;也…...

2023服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要求依赖的接口还未开发完成&#…...

ExoPlayer架构详解与源码分析(5)——MediaSource

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…...

控制一个游戏对象的旋转和相机的缩放

介绍 这段代码是一个Unity游戏开发脚本&#xff0c;它用于控制一个游戏对象的旋转和相机的缩放。以下是代码的主要功能&#xff1a; 控制游戏对象的旋转&#xff1a; 通过按下Q键和W键&#xff0c;用户可以选择以逆时针或顺时针方向绕游戏对象的Y轴进行旋转。旋转角度和速度可…...

【数据结构】线性表(二)单链表及其基本操作(创建、插入、删除、修改、遍历打印)

目录 前文、线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表&#xff08;C语言&#xff09; a. 链表节点结构 b. 创建新节点 c. 在链表末尾插入新节点 d. 删除指定节点 e. 修改指定节点的数据 f. …...

label的作用是什么?是怎么用的?(1)

Label&#xff08;标签&#xff09;在不同的上下文中有不同的作用和用途。以下是几种常见的用途和用法&#xff1a; 1. 数据标注&#xff1a;在机器学习和数据科学中&#xff0c;标签用于标识数据样本的类别或属性。标注数据是监督学习中的一项重要任务&#xff0c;它为算法提…...

C- 使用原子变量实现自旋锁

自旋锁 自旋锁&#xff08;Spinlock&#xff09;是一种常用于多线程编程中的低开销锁&#xff0c;其特点是当线程尝试获取锁而锁已被其他线程占用时&#xff0c;该线程会处于一个持续的忙等待&#xff08;busy-wait&#xff09;状态&#xff0c;直到它可以获取到锁为止。这种方…...

汇编的指令

减法类指令&#xff1a; 不带借位的减法&#xff1a; sub dest,src;dest(dest)-(src) 注意&#xff1a; 1、源操作数和目的操作数不能同时为段寄存器或存储单元 2、对标志位有影响&#xff0c;主要影响CF、ZF、OF、SF。 带借位的减法&#xff1a; sbb dest,src;dest(dest)-(…...

《数据结构、算法与应用C++语言描述》使用C++语言实现数组队列

《数据结构、算法与应用C语言描述》使用C语言实现数组队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…...

零基础如何学习自动化测试

现在很多测试人员有些急于求成&#xff0c;没有任何基础想当然的&#xff0c;要在一周内上手自动化测试。 在自动化的过程中时候总有人会犯很低级的问题&#xff0c;有语法问题&#xff0c;有定位问题&#xff0c;而且有人居然连__init__.py 文件名都弄错误&#xff0c;还有将…...

系统架构师备考倒计时16天(每日知识点)

1.信息化战略与实施 2.UML图&#xff08;12个&#xff09; 3.结构化设计&#xff08;耦合&#xff09; 4.SMP与AMP的区别&#xff08;多核处理器的工作方式&#xff09; 多核处理器一般有SMP和AMP两种不同的工作方式: SMP(对称多处理技术)&#xff1a;将2颗完全一样的处理器封…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...