《数据结构学习笔记---第五篇》---链表OJ练习上

目录

CM11链表分割

 OR36 链表的回文结构

 160.相交链表

 141&142环形链表

CM11链表分割

step1:思路分析 

1.首先可以想到,我们可以将原链表的元素划分到两个新的链表之中,由于必须保持顺序,所以新链表我们要用尾插。

2.为了方便进行尾插我们可以选择定义两个新的头结点。

step2:书写代码

class Partition {
public:ListNode* partition(ListNode* pHead, int x) {struct ListNode *LessPhead,*LessTail,*GreaterPhead,*GreadtTail;LessTail=LessPhead=( struct ListNode*) malloc(sizeof(struct ListNode));GreadtTail=GreaterPhead=( struct ListNode*) malloc(sizeof(struct ListNode));LessTail->next=GreadtTail->next= NULL;ListNode*cur=pHead;while(cur){if(cur->val<x){ListNode*pre1=cur;LessTail->next=pre1;LessTail=pre1;}else{   ListNode*pre2=cur;GreadtTail->next=pre2;GreadtTail=pre2;}cur=cur->next;}LessTail->next=GreaterPhead->next;GreadtTail->next= NULL;pHead=LessPhead->next;free(LessPhead);free(GreaterPhead);return  pHead;}
};

 OR36 链表的回文结构

step1:分析思路 

1.首先可以看到我们空间复杂度是有O(1)的要求的,所以不能开辟数组暴力解决。

2.我们想到回文结构是对称的,首先想到肯定是如何找到中间节点,之前写过求中间结点的代码,这次可以直接引用。

3.找到中间节点后,我们们可以让后续的翻转一下位置,又可以借用翻转链表的代码。

4.然后就是定义头和中间节点,遍历比对,实现判断。

step2:代码书写

struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}};#include <exception>
struct ListNode* middleNode(struct ListNode* head) {struct ListNode* cur1=head;struct ListNode* cur2=head;int count=0;int i=1;while(cur1->next){cur1=cur1->next;count++;}count++;while(i!=count/2+1){cur2=cur2->next;i++;}    return cur2;}
struct ListNode* reverseList(struct ListNode* head){//我的想法:第一种 建立一个新的链表头插struct ListNode* cur=head;struct ListNode* tail=NULL;while(cur){struct ListNode* next=cur->next; cur->next=tail;tail=cur;cur=next;}return tail;}
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {struct ListNode*mid= middleNode(A);struct ListNode*rehead=reverseList(mid);while(A&&rehead){if(A->val!=rehead->val){return false;}rehead=rehead->next;A=A->next;}return true;}
};

 160.相交链表

 

step1:分析思路

我们很容易想到由于单链表的特性 不可能存在next指针指向两个位置,因此只能是二合一并且尾部是保持单链的情况。

1.尝试反向遍历,违反单链表特性。

2.用一个数组存储一个链表的元素然后和另一个链表元素进行比较,显然时间复杂度因该是

O(N)空间复杂度也变成了O(N)。可行

3.统计链表长度,然后计算长度差值,长表先走相应的差值使得两个指针能够同步走,对比第一次元素相等时,就是想要的结果。时复O(N)  空复O(1)

step2:代码书写

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* cur1=headA;struct ListNode* cur2=headB;int count1=0;int count2=0;while(cur1->next){cur1=cur1->next;count1++;}count1++;while(cur2->next){cur2=cur2->next;count2++;}count2++;if(cur1!=cur2)//勿忽略{return NULL;}int gap=abs(count1-count2);struct ListNode*longlist=headA;struct ListNode*shortlist=headB;if(count1<count2){longlist=headB;shortlist=headA;}while(gap--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return shortlist;}

注意1:int gap=abs(count1-count2); //这是取了一个绝对值。

注意2:if(cur1!=cur2)//勿忽略
           {
                  return NULL;
            }
 

 141&142环形链表

step1:分析思路

判断是否有环

1.直接快慢指针,快指针会在环中兜圈会和慢指针相遇。

2.相遇的条件取决于两者的速度,这样就变成了一个数学的逻辑问题,如何制造相遇呢,假设slow一次走1步,fast一次走2步,入环前长度为L,环的长度为S,那么他们都差距步是一个2-1,4-2, 6-3,是一个顺序序列。那么当他们的差距步刚好为L+S时,就会相遇,所以如果有环他们迟早会相遇。

那么我们让fast一走3.4.5步又是什么情况呢,刚刚是通过差距步来判断的,现在同样如果fast一次走3步,那么差距步就是3-1,6-2,9-3是一个偶序列,最终如果(L+S )不是偶数或许永远不存在相遇。

判断环的入口

1.利用上面的参数,那么我们入环的入口就是L处,假设入口处与相遇处相差N

2. k是因为我们并不知道快指针走的圈数所以假设的值,但从图中我们可以得出相遇处到入口处S-N.

3.那么我们先走S-N将会到达入口处,其余走的都是整圈也就是我们定义一个meet再相遇处,一个origin在起始处,两者最终将会在入口处相遇。

step2:书写代码

判断是否有环


bool hasCycle(struct ListNode *head) {struct ListNode *fast=head;struct ListNode *slow=head;//如果没有环while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){return true;}}return false;}

判断环的入口


struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fast=head;struct ListNode *slow=head;//如果没有环while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){struct ListNode *meet=slow;struct ListNode *origin=head; while(meet!=origin){meet=meet->next;origin=origin->next;}return meet;}}return NULL;}

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

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

相关文章

自动化与智能化并行:数字化运维体系助力企业腾飞

文章目录 文章目录 文章目录 一、引言二、数字化运维体系的核心要素三、构建数字化运维体系的策略四、数字化运维体系的实施与挑战主要内容读者对象 一、引言 随着信息技术的迅猛发展&#xff0c;数字化转型已成为企业提升竞争力、实现可持续发展的必由之路。在数字化转型的过…

JSP – 支持WORD上传的富文本编辑器

1.下载示例 https://gitee.com/xproer/zyoffice-tinymce5 2.引入组件 3.配置转换接口 效果 泽优Office文档转换服务(zyOffice) 功能&#xff1a;一键导入Word转HTML&#xff0c;不装控件&#xff0c;不装Office&#xff0c;任意平台兼容(Windows,macOS,Linux,安卓Android,苹果…

Java文件基本操作入门指南

Java文件基本操作入门指南 文章目录 Java文件基本操作入门指南前言一、文件的基本操作1、文件的创建2、文件的写入3、文件的读取4、文件的删除 二、进阶操作与技巧1、文件的复制与移动2、文件内容的追加3、随机访问文件4、文件路径与名称操作 三、最佳实践与注意事项1、异常处理…

flutter boost 如何从native跳转到flutter页面

Flutter Boost 是一个 Flutter 插件&#xff0c;它可以帮助开发者在原生应用和 Flutter 应用之间无缝跳转。以下是一些基本步骤&#xff0c;展示了如何使用 Flutter Boost 从原生&#xff08;Native&#xff09;页面跳转到 Flutter 页面。 ### 1. 配置 Flutter Boost 在你的 …

【GPU系列】选择最适合的 CUDA 版本以提高系统性能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么是数据仓库

数据仓库定义 数据仓库,按照传统的定义,数据仓库是一个面向主题的、集成的、持久的(非易失的)、反映历史变化(随时间变化),用来支持管理人员决策的数据集合。 通俗讲,企业希望能够更快得处理比较多的数据,数据仓库由此诞生。 就像是企业的财务系统。各个部门(面向主…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种&#xff0c;所以为了适应各类版本node,使用nvm管理多种node版本&#xff0c;但是当我按教程安装nvm以后&#xff0c;nvm安装以后&#xff0c;node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址&#xff1a;https://github.com/coreybutler/…

数据结构——栈(C语言版)

前言&#xff1a; 在学习完数据结构顺序表和链表之后&#xff0c;其实我们就可以做很多事情了&#xff0c;后面的栈和队列&#xff0c;其实就是对前面的顺序表和链表的灵活运用&#xff0c;今天我们就来学习一下栈的原理和应用。 准备工作&#xff1a;本人习惯将文件放在test.c…

[C++]深入解析:如何计算C++类或结构体的大小

目录 什么是内存对齐 类的成员的存储规则 怎么进行内存对齐&#xff08;介绍规则与例子讲解&#xff09; 什么是内存对齐 内存对齐是指将数据存储在内存中时&#xff0c;按照一定的规则让数据排列在规定的地址上&#xff0c;以提高数据访问的效率和速度。在C中&#xff0c;结…

维修贝加莱工业电脑触摸屏BR 5PP320.0571-39 Power Panel 300工控屏

维修贝加莱工业电脑触摸屏B&R 5PP320.0571-39 Power Panel 300工控屏 贝加莱工业电脑4P3040.01-490 描述 贝加莱电源面板4P3040.01-490 扩展产品类型&#xff1a;HMI/触摸屏 产品编号&#xff1a;4P3040.01-490 B&R 类型名称&#xff1a;HMI/触摸屏 描述 Power…

鸿蒙OS开发问题:(ArkTS)【 RSA加解密,解决中文乱码等现象】

RSA加解密开始构建工具类就是举步维艰&#xff0c;官方文档虽然很全&#xff0c;但是还是有很多小瑕疵&#xff0c;在自己经过几天的时间&#xff0c;彻底解决了中文乱码的问题、分段加密的问题。 首先看官方示例代码(以RSA非对称加解密&#xff08;多次调用doFinal实现分段&a…

TikTok养号怎么做?打破0播放的前提是做好这些

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

spring boot 生成PDF模板文件

1、主要目录 2、maven依赖 <!--工具类依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><dependency><groupId>com.alibaba&l…

Python django vue 学生信息管理案例源码

Python django vue 学生信息管理案例源码 运行教程 开发环境 链接地址

56. 合并区间(力扣LeetCode)

文章目录 56. 合并区间题目描述思路贪心算法方法一&#xff1a;直接在res中修改代码逻辑梳理&#xff1a; 方法二&#xff1a;在原数组中插入一个超出题目范围的数组代码逻辑梳理&#xff1a; 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单…

律甲法务OA平台:信鸥科技引领法律行业新篇章

随着信息技术的飞速发展&#xff0c;法律行业也迎来了数字化转型的重要时刻。在这个信息化、智能化的时代&#xff0c;如何运用科技手段提升法律服务的质量和效率&#xff0c;成为法律行业亟待解决的问题。信鸥科技&#xff0c;作为业界的佼佼者&#xff0c;凭借其深厚的技术积…

7、jenkins项目构建细节-常用的构建触发器

文章目录 一、常用的构建细节1、触发远程构建2、其他工程构建后触发3、定时构建4、轮询SCM(Poll SCM)二、Git hook自动触发构建(☆☆☆)1、安装插件2、Jenkins设置自动构建3、Gitlab配置webhook三、Jenkins的参数化构建1、项目创建分支,并推送到gitlab上2、在Jenkins添加字…

Kafka详细教程(一)

总体目录 1、什么是消息队列 消息队列&#xff0c;英文名&#xff1a;Message Queue&#xff0c;经常缩写为MQ。从字面上来理解&#xff0c;消息队列是一种用来存储消息的队列 。来看一下下面的代码 // 1.创建一个保存字符串的队列Queue<String> queue new LinkedList&…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上&#xff0c;于是在各种旧版本…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器&#xff1b;支持 8K30fps 的 H.264 和H.265 编码器&#xff0c;高质量的 JPEG 编码器/解码器&…