单链表在线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.hqwc.cn/news/206365.html

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

相关文章

ultralytics yolov8 实例分割 训练自有数据集

参考: https://docs.ultralytics.com/datasets/segment/coco/ http://www.bryh.cn/a/613333.html 1、数据下载与转换yolo格式 1)数据集下载: 参考:https://universe.roboflow.com/naumov-igor-segmentation/car-segmetarion 下载的是coco格式,需要转换 2)coco2yolo t…

2023感恩节大促:跨境卖家如何借助海外网红营销赢得市场关注

随着全球贸易的日益发展&#xff0c;跨境电商行业变得愈发竞争激烈&#xff0c;各家卖家纷纷寻找新的营销策略以在大促期间脱颖而出。在2023年感恩节即将来临之际&#xff0c;海外网红营销成为许多卖家关注的热点。本文Nox聚星将和大家探讨跨境卖家如何充分利用海外网红营销&am…

视频云存储EasyCVR平台国标接入获取通道设备未回复是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

各大电商平台双十一“狂飙”,如何选择商城系统?

今年是“双十一”的第十五年。作为各大平台和品牌的全年最重要的营销节点&#xff0c;品牌们可谓是来势汹汹&#xff0c;各种促销活动和优惠力度让人眼花缭乱。 淘天数据显示&#xff0c;天猫促销活动开售当晚&#xff0c;155个品牌开卖成交额突破1亿元&#xff1b;首小时内7.1…

C语言—指针入门

内存存放数据 如果发送指令&#xff0c;读取f变量的内容&#xff0c;则先找f - >10005这个字节&#xff0c;然后再找到123。 指针和指针变量 通常说的指针就是地址的意思&#xff0c;C中有专门的指针变量存放指针。一个指针占4个字节。 定义指针变量 类型名 *指针变量名…

基于Haclon的Blob分析

任务要求&#xff1a; 请用BLOB分析的方法计算图中所有灰度值在120和255之间的像素构成的8连通区域的面积与中心点坐标。 Blob基础&#xff1a; 分析过程&#xff1a;首先获取图像&#xff0c;然后根据特征对原始图像进行阈值分割&#xff08;区分背景像素和前景像素&#xf…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

亚马逊买家号用邮箱怎么注册

想要用邮箱注册亚马逊买家号&#xff0c;那么准备好能接受验证码的邮箱后打开相应的亚马逊官网即可。打开官网后点击注册——输入昵称——输入邮箱——输入密码——接受邮箱验证码并输入&#xff0c;如果遇到需要手机号验证就输入手机号&#xff0c;如果不需要验证&#xff0c;…

【追求卓越13】算法--深度和广度优先算法

引导 前面的几个章节&#xff0c;我们介绍了树这种数据结构&#xff0c;二叉搜索树在进行查找方面比较高效&#xff1b;有二叉树演变来的堆数据结构在处理优先级队列&#xff0c;top K&#xff0c;中位数等问题比较优秀&#xff1b;今天我们继续介绍新的数据结构——图。它在解…

主机dbeaver访问gitlab容器中的pg

映射5432端口- 5431:5432或者从docker客户端查看 version: 3.6 services:web:image: gitlab/gitlab-ce:latestrestart: alwayshostname: localhostenvironment:GITLAB_OMNIBUS_CONFIG: |external_url http://localhost:8929gitlab_rails[gitlab_shell_ssh_port] 2224ports:- …

Leetcode:622. 设计循环队列 题解【具详细】

目录 一、题目&#xff1a; 二、思路详解&#xff1a; 1.循环队列的存储定义 2.循环队列的创建 3.循环队列的判空与判断情况 (1) 循环队列的判空: (2) 循环队列的判满 4.循环队列元素的插入 5.循环队列元素的删除 6.获取队头元素 7.获取队尾元素 8.循环队列释放 三…