链表OJ题(移除链表元素,反转链表,分割链表,环形链表(是否成环问题),链表中间节点(快慢指针讲解),环形链表(找入环节点))“题目来源力扣附带题目链接”

目录

1.移除链表元素

2.反转链表

2.1三指针法

2.2头插法 

3.分割链表

4.链表的中间节点(快慢指针)

4.1快慢指针

4.2求链表的中间节点

5.环形链表

5.1环形链表是否成环

5.2环形链表入环节点

  5.3入环节点推论的不完备性说明


1.移除链表元素

移除链表元素题目链接

题目的链接在上面,这个题涉及到当链表被删除为空时返回值也为空,所以建议大家不在原链表上进行更改,我的思路是再创建两个节点类型的结构体指针(phead,ptail)然后用尾插的方式,将不等于我们链表元素的节点尾插到新的链表里面。

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode SL;
struct ListNode* removeElements(struct ListNode* head, int val) {SL* newhead , *newtail;newhead = newtail = NULL;SL* pcur = NULL;pcur = head;while(pcur){if(pcur->val!=val){if(newhead == NULL){newhead = newtail = pcur;}else{newtail->next = pcur;newtail = newtail->next;}}pcur=pcur->next;}if(newtail){newtail->next=NULL;}return newhead;
}

 

像这样一步一步进行尾插最后返回phead就完成了。

2.反转链表

反转链表题目链接

我们需要把链表进行改方向把链表的顺序颠倒,这里提供两个方法:一个是三指针法,头插入法。

2.1三指针法

我们需要定义三个链表结构体指针n1,n2,n3,我们将n1指向链表第一个节点,n2指向第二个节点,n3指向第三个节点,我们将n2->next指向n1,再n1指向n2,n2指向n3,n3指向n3->next,依次这样就可以反转链表了。

我们在设计这个循环的时候我们应该的进入循环的条件应该是n3指针不为空指针,在要注意的有两点:

1.n1->next一定要指向NULL;

2.判断是否结束循环条件的时候一定要注意n3是否越界访问。

思路如上图所示:

代码如下所示:
 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode listnode;
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL||head->next == NULL){return head;}listnode *n1 = head;listnode *n2 = head->next;listnode *n3 = head->next->next;n1->next = NULL;n2->next = n1;while(n3){n1 =n2;n2 = n3;n3 = n3->next;n2->next = n1;}return n2;
} 

2.2头插法 

我们定义两个空指针(phead,ptail),再定义一个指针pcur记录原链表节点位置,我们采用第一题的思路我们选择头插来插入数据这样也可以实现。

像这样循环就可以将链表反转过来。

代码如下所示:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode LN;
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL||head->next == NULL){return head;}LN*pcur = head;LN*phead = NULL;LN*ptial = NULL;while(pcur){if(phead==NULL&&ptial == NULL){phead = ptial = pcur;}else{LN*temp = pcur;pcur = pcur->next;temp->next = phead;phead = temp;}}ptial->next = NULL;return phead;}

3.分割链表

分割链表题目

这道题我们的思路就是把链表分为两个,一个存放小于X的节点,一个存放大于或等于X的节点,再把小链表的尾和大链表的头连在一起最后返回小链表的头。

如上图一样循环,再把greatphead和lessptail链表连接起来就行了。 

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode SL;
struct ListNode* partition(struct ListNode* head, int x){if(head == NULL){return head;}   SL* greaterhead,*greatertial,*lesshead,*lesstial;SL* pcur;pcur = head;greaterhead = greatertial = (SL*)malloc(sizeof(SL));lesshead = lesstial = (SL*)malloc(sizeof(SL));while(pcur){if(pcur->val < x){lesstial->next = pcur;lesstial = lesstial->next; }else{greatertial->next = pcur;greatertial = greatertial->next;}pcur = pcur->next;}greatertial->next = NULL; lesstial->next = greaterhead->next;SL* ret = lesshead->next;free(lesshead);free(greaterhead);return ret;
}

4.链表的中间节点(快慢指针)

4.1快慢指针

快慢指针在不同的时候会有不同的使用方法表明的是一种思像实质就是用链表的遍历进程来抽象数学问题。下面有几道例题。

4.2求链表的中间节点

求链表的中间节点

我们在看到这个题的时候容易想到的方法是先遍历链表同时计数,然后再除2得到中间节点的位置是第几个元素,再从头找到该位置的节点并返回。

这个方式我们可以看出时间复杂度为O(N+N/2),也就是O(N)。当链表特别长的时候我们会发现这样太复杂了浪费时间。

我们思考一个数学问题:汽车甲的速度是10m/s,汽车乙的速度是20m/s,两辆汽车同时启动行驶1km当一辆汽车到达终点的时候另一辆汽距离终点还有多远?

答案很轻松就可以知道是500米。

我们把这个问题抽象到这道题里面就产生了我们的快慢指针这个概念。

实现步骤如下图所示:

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode SL;
struct ListNode* middleNode(struct ListNode* head) {SL* fast,*slow;fast = slow = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}

这里需要注意的是我们的while循环条件要注意先后顺序一定是fast && fast->next,如果fast->next在前面会出现越界访问。

5.环形链表

环形链表中也会使用到快慢指针的思想

5.1环形链表是否成环

环形链表1

这里就好比我们同学在操场上面进行体育测试有些跑得快的同学可以套跑的慢的同学一圈,被套了一圈就说明两个同学一定相遇过一次。我们根据这个方法也可以使用快慢指针来实现这个过程。

我们让一个指针一次走一步另一个一次走两步如果两个指针相遇了就返回true没有相遇就返回false。

问题:为什么是一个走一步一个走两步为什么不能是其他步数?
答 :在成环的时候我们的指针是不是要保证一定需要相遇,能一定满足这个条件的就是一个走两步一个走一步因为在整数当中只有奇数和偶数两种就表明在当慢指针入环时第一圈不能相遇的话第二圈一定会相遇,这样我们就保证在能发现它是环形链表的同时走尽量少的步数。

代码如下:

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

5.2环形链表入环节点

 环形链表2

我们利用快慢指针先来找一下里面的数学关系:

经过上图所找到的关系我们可以设计我们的程序 。

我们先用快慢指针的方法找到相交节点再用一个指针从头开始,一个指针从相交节点开始都走一步两个节点都指向同一个节点的时候就可以确定它是入环节点。

代码如下:

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

  5.3入环节点推论的不完备性说明

我们看见上面的例子举的其实是一个特殊例子:

就是这句话 我们才得出的L= R-H这个结论,但是当我们的入环节点前的链表长度远远大于环形链表的长度的时候fast一定是在里面走了多圈才相遇的,我们应该引入变量n (n>=1)来表示走的圈数。

所以结论应该是:

L = nR - H。

这道题的测试用例就只讨论了我们前面讨论的特殊情况。 


 


 

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

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

相关文章

Microsoft Threat Modeling Tool 使用(三)

Boundary&#xff08;边界&#xff09; 本文介绍信任边界&#xff0c;基于 SDL TM Knowledge Base (Core) 模版&#xff0c;这是一个通用的威胁建模模板&#xff0c;非常适合初学者和大多数威胁建模需求。 这些边界&#xff08;Boundary&#xff09;在微软威胁建模工具中用于表…

Java多线程与高并发

1、什么是进程?什么是线程? 进程:进程是程序的基本执行实体;另外一种解释是进程是一个应用程序(1个进程是一个软件)。 线程:线程是操作系统能够进行运算调度的最下单位。它被包含在进程之中,是进程中的实际运作单位;是一个进程中的执行场景/执行单元。 注意:。一个进…

在云服务器上运行StyleGAN3生成伪样本

首先是传入数据&#xff0c;这里我们不做赘述。 对于数据格式的裁剪&#xff0c;可以通过以下代码进行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

【Oracle篇】rman物理备份工具的基础理论概述(第一篇,总共八篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

嵌入式是大坑的说法,是否与学生的信息不对称有关?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 目前也算是在搞嵌入式&#…

【深度学习】时空图卷积网络(STGCN),预测交通流量

论文地址&#xff1a;https://arxiv.org/abs/1709.04875 Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 文章目录 一、摘要二、数据集介绍美国洛杉矶交通数据集 METR-LA 介绍美国加利福尼亚交通数据集 PEMS-BAY 介绍美国…

Cocktail for Mac 激活版:一站式系统优化与管理神器

Cocktail for Mac是一款专为Mac用户打造的系统优化与管理工具&#xff0c;凭借其强大的功能和简便的操作&#xff0c;赢得了广大用户的喜爱。这款软件集系统清理、修复和优化于一身&#xff0c;能够帮助用户轻松解决Mac系统中的各种问题&#xff0c;提高系统性能。 Cocktail fo…

Leetcode-有效的括号(带图)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-parentheses/ 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&…

在做题中学习(59):除自身以为数组的乘积

238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前缀积和后缀积 思路&#xff1a;answer中的每一个元素都是除自己以外所有元素的和。那就处理一个前缀积数组和后缀积数组。 而前缀积(f[i])是&#xff1a;[0,i-1]所有元素的乘积 后缀…

如何利用香港多IP服务器实现定制化的网络服务

如何利用香港多IP服务器实现定制化的网络服务 在当今数字化快速发展的时代&#xff0c;企业对于网络服务的需求日益增加&#xff0c;尤其是对于定制化和高度可调整的网络服务的需求。香港&#xff0c;作为国际金融中心和数据中心的枢纽&#xff0c;提供了优越的网络基础设施和…

什么是蜜罐,在当前网络安全形势下,蜜罐能提供哪些帮助

在当前的互联网时代&#xff0c;网络安全威胁日益严峻&#xff0c;攻击手段层出不穷。为了应对这些威胁&#xff0c;网络安全专家们不断探索新的防御手段&#xff0c;在过去的几年里&#xff0c;一种更加积极主动的网络安全方法正在兴起。蜜罐技术便是这样一种备受瞩目的主动防…

【教学类-55-05】20240516图层顺序挑战(三格长条纸加黑色边框、3*3、5张,不重复7186张,9坐标点颜色哈希值去重、保留5色)

背景需求&#xff1a; 前期测试了4*4框格种的8种颜色&#xff0c;随机抽取7种&#xff0c;随机排列图层&#xff0c;去掉相同的图片、保留7种颜色的图片&#xff0c;最后获得5400张样图 【教学类-55-04】20240515图层顺序挑战&#xff08;四格长条纸加黑色边框、4*4、7张&…

Python程序设计 文件处理(二)

实验十二 文件处理 第1关&#xff1a;读取宋词文件&#xff0c;根据词人建立多个文件 读取wjcl/src/step1/宋词.txt文件&#xff0c; 注意&#xff1a;宋词文件的标题行的词牌和作者之间是全角空格&#xff08;" ")可复制该空格 在wjcl/src/step3/cr文件夹下根据每…

【CSND博客纪念】“创作纪念日:从灵感迸发到小有成就——我的CSND博客创作之旅”

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

算法分析与设计复习__递归方程与分治

总结自&#xff1a;【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归&#xff0c;递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解&#xff1b; 2.这个问题与分解之后的子问题&#xff0c;除了数据规模不同&#xff0c;求解思路完全一样; 3.存在…

【面试干货】一个数组的倒序

【面试干货】一个数组的倒序 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 创建一个新的数组&#xff0c;然后将原数组的元素按相反的顺序复制到新数组中。 2、代码实现 package csdn;public class…

一个强大的在线解析网站,无需登录,只用把视频链接粘贴进去就能免费解析下载视频。

TiQu.cc是什么&#xff1f; TiQu.cc是一个强大的在线工具&#xff0c;让用户可以从包括Facebook、VK、Twitter、Tiktok、Instagram等在内的100多个平台下载他们喜爱的视频。不论是音乐、电视节目、电影、短片还是个人上传的内容&#xff0c;TiQu.cc都可以帮助您随时随地以离线…

ChatGPT 4o 使用案例之一

2024年GPT迎来重大更新&#xff0c;OpenAI发布GPT-4o GPT-4o&#xff08;“o”代表“全能”&#xff09; 它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。它可以在 232 毫秒内响应音频输入&#xff0c;平均为 320 毫秒&…

把tif的值映射到shp栅格

目录 问题描述代码结果示例 问题描述 假如目前有一个&#xff08;多个&#xff09;tif文件和一个shp文件&#xff0c;想要把tif中每个像素的值集成到shp文件的新字段中。如果栅格和像素是一一对应的&#xff0c;问题将会变得非常简单&#xff1a;直接把每个像素的值映射到每个…