单链表在线OJ题二(详解+图解)

1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针

在这里插入图片描述
本题的意思是要删除链表中重复出现的节点,然后返回删除重复节点后的链表。
我们可以直接用一个哨兵位以便于观察链表的情况,然后用前后指针来解决这个问题。如果当前节点cur的值与其当前节点的next的所存储的值相等(且cur的next不为空),cur就变成cur的next,然后用while循环进行判断,如果cur的val与cur的next的val相等且cur的next不为空,就然后cur往后移动,直到遇到不相同的情况,跳出循环后cur还要记得移动到cur的next;然后再将前指针prev的next置为cur,这样就可以将相等的节点省略。当cur的next为空或者cur的值与cur的next的值不相等时,就直接先将prev置为cur,再将cur往后移动变成cur的next。最后返回哨兵位vpead的next,就是存储了有效数据的首节点,就可以返回整个删除后的单链表了。
在这里插入图片描述

完整代码如下:

struct ListNode *deleteDuplication(struct ListNode *pHead)
{struct ListNode *vHead;vHead = (struct ListNode *)malloc(sizeof(struct ListNode));vHead->next = pHead;//定义虚头结点方便边界情况讨论struct ListNode *pre, *cur;pre = vHead, cur = pHead;while (cur){if (cur->next && cur->val == cur->next->val){cur = cur->next;while (cur->next && cur->val == cur->next->val)cur = cur->next;//当遇到与下一节点值相同时,cur推进到最后一个重复的数字处//本数字舍去,pre连接到下一个cur = cur->next;pre->next = cur;}//遇到与下一节点值不同或者是没有下一节点时,pre移动到此处,cur继续后移else if(!cur->next || cur->val != cur->next->val){pre = cur;cur = cur->next;}}return vHead->next;
}
2.对链表进行插入排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本题也要使用到哨兵位,用哨兵位的next最后可以返回排序完后的链表,并且使用前后指针,进行大小比较,若是逆序则用前后指针的关系进行交换即可
完整代码如下:

struct ListNode *insertionSortList(struct ListNode *head) 
{if (head == NULL) return head;struct ListNode *dummyHead = malloc(sizeof(struct ListNode));dummyHead->val = 0;dummyHead->next = head;//哨兵位struct ListNode *lastSorted = head;struct ListNode *curr = head->next;while (curr != NULL) {if (lastSorted->val <= curr->val) {lastSorted = lastSorted->next;} else {struct ListNode *prev = dummyHead;while (prev->next->val <= curr->val) {prev = prev->next;}lastSorted->next = curr->next;curr->next = prev->next;prev->next = curr;}curr = lastSorted->next;}return dummyHead->next;
}
3.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

在这里插入图片描述
本题的意思很简单,就是一个判断链表是否有环的问题,如果有环就返回那个节点,看图就明白了,就是最后一个节点的next会连接到前面的节点,就是有环。
到这里我们就要有一个大概的思路了–快慢指针!
我们用慢指针slow一次走一步,fast一次走两步,到最后他们就一定会相遇,因为他们移动的差距只有一步一次追一步就必然会相遇。当slow和fast相遇时,我们再定义一个新指针从头节点开始往后移动,同时将slow或者fast往后移动,当这个新指针与slow或者fast相等时这个节点就返回这个节点,这个节点就是链表尾链接到链表的节点。
在这里插入图片描述

完整代码如下:

struct ListNode* detectCycle(struct ListNode* head) 
{struct ListNode *slow = head, *fast = head;while (fast != NULL) {slow = slow->next;if (fast->next == NULL) {return NULL;}fast = fast->next->next;if (fast == slow) {struct ListNode* ptr = head;while (ptr != slow) {ptr = ptr->next;slow = slow->next;}return ptr;}}return NULL;
}
4.给定一个链表,判断链表中是否有环

在这里插入图片描述
有了上一题的思路,这一题就很简单了,让slow指针和fast指针分别往后移动,slow一次走一步,fast一次走两步,如果二者能相遇(相遇即slow指针会与fast指针相等),那就是链表中有环,否则无环;
在这里插入图片描述

完整代码如下:

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;
}
5.输入两个链表,找出它们的第一个公共结点

在这里插入图片描述
其实这一题也很简单
首先我们得判断这个链表是否会相交,如果相交,那么两个链表的尾节点就会相等,若不想等就直接返回NULL指针
其次我们分别求两个链表的长度,用tail尾指针遍历求出lenA,lenB
然后我们用lenA-lenB相减的绝对值就能得出两个链表的长度差gap,让长的链表先走gap步,然后短的链表再和长的链表一起走,当两个链表的指针节点相等时,这个节点就是两个链表相遇的节点,返回这个节点即可
在这里插入图片描述

完整代码如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* tailA=headA;struct ListNode* tailB=headB;int lenA=1;int lenB=1;while(tailA){tailA=tailA->next;lenA++;}while(tailB){tailB=tailB->next;lenB++;}if(tailA!=tailB){return NULL;}int gap=abs(lenA-lenB);struct ListNode* longlist=headA;struct ListNode* shortlist=headB;if(lenA<lenB)//若长链表尾b则互换{longlist=headB;shortlist=headA;  }while(gap--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}

我们再OJ题的解题中可以发现,快慢指针的解题思路是非常重要的,大家可以多去做一点题 !
好了,今天的分享到这里就结束了,谢谢大家的支持!

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

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

相关文章

指针变量和地址

A.指针变量和地址 理解了内存和地址的关系&#xff0c;我们再回到C语⾔&#xff0c;在C语⾔中创建变量其实就是向内存申请空间&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ⽐如&#xff0c;上述的代码就是创建了整型变量a&…

spring-boot-admin-starter-server监控springboot项目

文章目录 场景实现具体操作展示 场景 监控三件套Prometheus、Grafana、Alertmanager 部署起来太复杂,如果公司没有运维而且项目很小就可以使用spring-boot-admin-starter-server替代。这个包使用起来还是很简单的, 下面就实现一个对springCloud项目的监控 实现 参考 项目 具体操…

经典中的经典之字符串

前言&#xff1a;前段时间发烧了&#xff0c;所以耽误了很多事情&#xff0c;一直没有更新&#xff0c;多穿点衣服&#xff0c;感冒不好受。 接下来有时间就会陆续更新一些基础的算法题&#xff0c;题目都很经典&#xff0c;大家可以先尝试着做&#xff0c;再看 解析。 第一…

Windows常用cmd网络命令详解

中午好&#xff0c;我的网工朋友。 上回给你们梳理了一些有趣的cmd命令&#xff0c;很多朋友希望再拓展一下&#xff0c;这不就来了&#xff1f; 今天从windows切入&#xff0c;给你分享一些常用cmd网络命令&#xff0c;如果能熟悉上手&#xff0c;很多功能都可以快速实现&am…

Java Class 类文件格式看这一篇就够了

本文将揭开Java Class文件的神秘面纱&#xff0c;带你了解Class文件的内部结构&#xff0c;并从Class文件结构的视角告诉你&#xff1a; 为什么Java Class字节码文件可以“写一次&#xff0c;遍地跑”&#xff1f;为什么常量池的计数从1开始&#xff0c;而不是和java等绝大多数…

【JVM精讲与GC调优教程(概述)】

如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…

【人工智能入门学习资料福利】

总目录如下&#xff08;部分截取&#xff09;&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取码&#xff1a; ifu6

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

SQL语句执行过程

一条 SQL 的执行过程可以大致分为以下几个步骤&#xff1a; 连接器&#xff1a; ○ 客户端与数据库建立连接&#xff0c;并发送 SQL 语句给数据库服务。 ○ 连接器验证客户端的身份和权限&#xff0c;确保用户有足够的权限执行该 SQL 语句。查询缓存&#xff1a; ○ 连接器首先…

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹰栖息优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

Motion v5.6.7 苹果电脑上的视频编辑

Motion mac是一款运行在苹果电脑上的视频编辑软件&#xff0c;它能让您自定Final Cut Pro字幕、转场和效果。 它可以在2D或3D空间中创建您自己的精美炫目的动画&#xff0c;同时还能在您工作时提供实时反馈。广色域支持让你的动态图形更显出色光彩。3D文字功能经过优化增强&am…

01背包与完全背包学习总结

背包问题分类见下图 参考学习点击&#xff1a;代码随想录01背包讲解 01背包问题&#xff1a; 核心思路&#xff1a; 1、先遍历物品个数&#xff0c;再遍历背包容量。因为容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢减少&#xff0c;但背包容量…

上海泗博MODBUS转PROFINET网关TS-180 网关连接LED显示屏应用案例

项目 常州某钢铁公司的轧钢车间为了更清晰地显示当天轧钢系统各环节的工作参数&#xff0c;如轧钢的日期、钢种、吐丝机设备运行情况等&#xff0c;引进了另一家为其定制的LED显示屏。轧钢系统各环节的设备参数通过西门子S7-1500PLC采集后&#xff0c;实时显示在LED显示屏上&am…

飞瓜数据B站丨B站UP主11月第3周榜单排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年11月13日-11月19日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营…

Linux网络——传输层

目录 一.再谈端口概念 二.UDP协议 1.UDP协议格式 2.UDP的特点 3.面向数据报 4.UDP的缓冲区 5.UDP使用注意事项 6.UDP协议在内核中的表现形式 7.基于UDP的应用层协议 三.TCP协议 1.TCP协议格式 2.TCP确认应答机制 3.超时重传机制 4.TCP报文六位标志位 5.滑动窗口 6…

Flutter开发实践:用一套代码构建多端精美应用

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Python下使用requests库遇到的问题及解决方案

每一盏灯都有一个故事……当凌晨2点我的房间灯还亮着时&#xff0c;那就是我与BUG的一场生死博弈。一个人静静地坐在电脑前不断地写代码&#xff0c;感觉快要麻木了&#xff0c;好比闭关修炼一样枯燥无味。最终当我打通任督二脉后&#xff0c;bug修复迎来的一片曙光。 一、问题…

clang+llvm多进程gdb调试

clangllvm多进程gdb调试 前言1. 命令行gdb2. 父进程调试3. 子进程调试4. 返回父进程 前言 在学习新增llvm的优化pass时&#xff0c;需要跟踪clang及llvm的调用栈。然而llvm通过posix_spawn()创建了新进程&#xff0c;这使得gdb调试必须有一定的技巧了。 1. 命令行gdb 以下命…

函数式编程-Stream流笔记-三更草堂

函数式编程-Stream流 1. 概述 1.1 为什么学&#xff1f; 能够看懂公司里的代码 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 //查询未成年作家的评分在70以上的书籍 由于数据中作家和书籍可能出现重复&#xff0c;需要进行去重 List<Book> bookList new Ar…

4G5G智能执法记录仪在保险公司车辆保险远程定损中的应用

4G智能执法记录仪&#xff1a;汽车保险定损的**利器 随着科技的不断进步&#xff0c;越来越多的智能设备应用到日常生活中。而在车辆保险定损领域&#xff0c;4G智能执法记录仪的出现无疑是一大**。它不仅可以实现远程定损&#xff0c;还能实现可视化操作、打印保单以及数据融…