链表拆分与快慢指针相关算法题|一拆分为二|判断链表是否带环|返回倒数第k个节点(C)

LeetCode hot 100 解题思路记录(一) 重叠是则更新列表最后一个区间的右边界,取两者最大值否则直接添加到结果列表返回结果列表。 阅读详情

一拆分为二

设 C = a 1 , b 1 , a 2 , b 2 , … , a m , b m C={a_{1},b_{1},a_{2},b_{2},\dots,a_{m},b_{m}} C=a1​,b1​,a2​,b2​,…,am​,bm​,为线性表,采用带头节点的单链表存放,将其拆分为两个线性表
使得 A = a 1 , a 2 , … , a n A=a_{1},a_{2},\dots,a_{n} A=a1​,a2​,…,an​, B = b n , … , b 2 , b 1 B=b_{n},\dots,b_{2},b_{1} B=bn​,…,b2​,b1​

算法思想

循环遍历链表C,
采用尾插法将一个节点插入表A,这个节点为奇数号节点,这样建立的表A与原来的节点顺序相同;
采用头插法将下一节点插入表B,这个节点为偶数号节点,这样建立的表B与原来的节点顺序正好相反
![[Pasted image 20241106204401.png]]

malloc一个B头节点,将B的next指向NULL
![[Pasted image 20241106204918.png]]

用一个工作指针cur来指向A表的第一个节点,准备遍历A表
用一个tail指针指向A头节点,用来尾插找尾
cur往后遍历A表,直到cur指向空时结束
![[Pasted image 20241106205224.png]]

将tail的next也就是A的next指向cur,这里不动
![[Pasted image 20241106205257.png]]

tail指针后移,指向A表的最后一个节点
![[Pasted image 20241106205326.png]]

cur指向cur的next,后移一位
这时候cur走向偶数位置,判断cur是否指向空
用next保存cur的下一个节点
![[Pasted image 20241106205457.png]]

cur的next指向B的next,将cur头插到B表
![[Pasted image 20241106205601.png]]

B的next指向cur
![[Pasted image 20241106205626.png]]

cur指向next
![[Pasted image 20241106205647.png]]

再进行A表的尾插
![[Pasted image 20241106205815.png]]

再进行B表的头插
![[Pasted image 20241106205842.png]]

将tail的next指向NULL
![[Pasted image 20241106210017.png]]

LinkList DisCreat(LinkList &A)
{
	LinkList B = (LinkList)malloc(sizeof(LNode));  //创建B表表头
	B->next = NULL;     //B表初始化
	LNode* cur = A->next, *next;  //cur为工作指针
	LNode* tail = A;         //tail始终指向A的尾节点
	while (cur)
	{
		tail->next = cur;    //将*cur链到A的表尾
		tail = cur;
		cur = cur->next;
		if (cur)
		{
			next = cur->next;  //头插后,*cur将断链,用next记忆*cur的后继
			cur->next = B->next;  //将*cur插入到B表的前端
			B->next = cur;
			cur = next;
		}
	}
	tail->next = NULL;    //A尾节点的next指向NULL
	return B;
}

判断链表是否带环

单链表有环,是指单链表的最后一个节点的指针指向了链表中的某个节点,判断单链表是否存在环

算法思想

设置快慢指针分别为fast和slow最初都指向链表头head
slow每次走一步,fast每次走两步
fast走得比slow快,若有环,则fast一定先进入环
两个指针进入环后,一定会在环上相遇
链表分割|链表的回文结构|相交链表|环形链表|随机链表的复制©-优快云博客
这里有详细说明过程,环形链表1和2
![[Pasted image 20241106221440.png]]

LNode* FindLoopStart(LNode* head)
{
	LNode* fast = head, *slow = head;  //设置两个快慢指针
	while (fast && fast->next)
	{
		slow = slow->next;             //每次走一步
		fast = fast->next->next;       //每次走两步
		if (slow == fast)              //相遇
			break;
	}
	if (fast == NULL || fast->next == NULL)
		return NULL;                   //没有环,返回空
	LNode* p1 = head, *p2 = slow;      //分别指向开始点,相遇点
	while (p1 != p2)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	return p1;                         //返回入口点
}

一个指针从头节点开始走,一个节点从相遇点开始走,当两个指针相遇的时候,就是入口点

返回倒数第k个节点

输入一个链表,输出该链表的倒数第k个节点

算法思想

快慢指针思想
将fast指针指向链表的第k+1个节点,slow指向链表的第一个节点,此时fast和slow之间刚好相差k个节点,两个指针同步向后走,当fast走到链表的尾部空节点时,slow指针正好指向链表的倒数第k个节点
![[Pasted image 20241106225844.png]]

fast先走k步,之后同步走
![[Pasted image 20241106225922.png]]

直到fast指向空
![[Pasted image 20241106230012.png]]

LNode* getKthFromEnd(LinkList &head, int k)
{
	if (head == NULL)
		return NULL;
	LNode* fast = head, *slow = head;
	int i = 0;
	while (fast)
	{
		if (i >= k)
		{
			slow = slow->next;
		}
		fast = fast->next;
		i++;
	}
	return slow;
}
好未来秋招笔试算法题全解析:从数据结构到动态规划的备战指南 秋招笔试是技术岗求职的关键关卡,尤其是教育科技领域的头部企业,往往通过算法与数据结构题目筛选候选人。笔试不仅考察排序、动态规划、字符串处理等基础算法能力,更注重边界条件处理与工程思维。掌握二叉树、链表、堆等核心数据结构,理解递归与分治思想,熟悉在线OJ系统的输入输出模板,都是提升笔试通过率的关键。从“第K大的数”到“合并K个有序链表”,再到“岛屿最大面积”,每一类题型都有稳定的解题框架。好未来作为教育科技公司的代表,其笔试题目在传统算法基础上融入了业务场景题,考察候选人将技术落地到实际教育场景的能力。备战秋 阅读详情

相关推荐

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

C语言数据结构——链表OJ题

本文总结了五道经典链表算法题的解法:1.返回倒数第k个节点(双指针法);2.判断回文链表(找中点+反转后半部分);3.相交链表(计算长度差+同步遍历);4.环形链表检测与入环节点查找(快慢指针+数学推导);5.带随机指针链表的深拷贝(节点复制+拆分)。每道题都提供了清晰的解题思路和代码实现,重点讲解了双指针技巧在链表问题中的应用,包括快慢指针的多种使用场景,以及如何处理链表中的特殊结构如环和随机指针。这些解法体现了链表问题的核心解决思路和算法优化方法。

taodangou_noob的博客 858

Jetson工业级应用指南:用Orin NX 16GB打造多摄像头AI质检系统

本文详细介绍了如何利用NVIDIA Jetson Orin NX 16GB构建高效的多摄像头AI质检系统,涵盖硬件选型、软件优化及产线部署全流程。通过100 TOPS的AI算力和多路视频处理能力,Orin NX在工业4.0时代展现出卓越的实时缺陷检测性能,特别适合嵌入式AI应用场景。

Pepper的专栏 307

LC-随机链表的复制、排序链表、合并K个升序链表、LRU缓存

为了在时间复杂度内解决这个问题,并且使用A'B'C'ABCrandomrandomrandom。

m0_73902080的博客 1017

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4811

YOLOv8损失函数升级:从CIoU到Wise-IoU v3的实战调优与避坑指南

本文详细介绍了如何将YOLOv8的损失函数从CIoU升级到Wise-IoU v3,以提升目标检测性能,特别是在小目标检测和样本不均衡场景下的表现。通过实战调优步骤和避坑指南,帮助开发者有效应用Wise-IoU v3的动态聚焦机制和单调性控制,显著提升模型精度和训练稳定性。

weixin_33737774的博客 590

链表相关其他算法题2|排序插入节点|按数据类型拆分链表|输出次数最多的前k个词|三个链表公共元素|两个整数数位求和(C)

设民航公司有一个自动预订飞机票的系统,该系统中有一张用双重链表示的乘客表,表中节点按乘客姓氏的字母序相连 为该系统写一个当任意乘客订票时修改乘客表的算法av是可用数组空间的最小下标 按数据类型拆分链表 已知L为没有头节点的单链表中第一个节点的指针,每个节点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符 构造三个以带头节点的单循环链表表示的线性表,是每个表中只含有同一类字符首先要构造含有这三类字符的表头节点 然后从原链表的第一个节点开始,根据数据域的类型分别插入到三个链表之一 采用前插法 输

ChoSeitaku的博客 531

售货机非现金支付开发指南:MDB协议下VPOS刷卡器的那些坑

本文深入探讨了MDB协议下非现金支付设备的开发实践,重点解析了NAYAX VPOS刷卡器的集成难点与解决方案。从RS232通信参数配置到Always idle功能实现,提供了一套完整的售货机支付系统开发指南,帮助开发者规避常见陷阱,提升设备兼容性与交易稳定性。

weixin_29258297的博客 134

链表算法精讲:Hot100经典题解与面试技巧

链表作为基础数据结构,通过指针连接节点实现高效插入删除操作,时间复杂度为O(1)。其核心原理在于指针操作与递归思维,广泛应用于内存管理、文件系统等工程场景。在算法领域,链表问题常考察快慢指针、虚拟头节点等技巧,如环形链表检测、LRU缓存实现等高频面试题。掌握hot100链表专题不仅能提升面试通过率,更能深入理解数据结构本质,其中递归解法和迭代优化是工程实践中的关键。本文通过LeetCode经典案例,详解链表问题的通用解题模式与边界处理技巧。

weixin_30652491的博客 306

ROS专栏—基于STM32F103的INA219电源数据采集

文章主要记录了stm32f103对ina219的数据采集

热爱生活、奋斗前行 2353

国科大学习资料--计算机视觉--期末考试解析

国科大学习资料–计算机视觉(胡占义)–期末考试解析 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

无名何许人的博客 2465

链表核心操作:遍历与插入节点的原理、实现与避坑指南

数据结构是计算机科学的基础,而链表作为一种经典的动态数据结构,其核心在于通过指针或引用实现节点间的非连续链接。理解链表的关键在于掌握其底层原理:每个节点包含数据域和指向下一个节点的指针域,这种设计使得插入和删除操作在已知位置时具有O(1)的时间复杂度,但访问任意节点需通过遍历实现。链表的技术价值在于高效处理动态数据集合,尤其适用于频繁插入、删除而较少随机访问的场景,如实现队列、栈、哈希表冲突解决以及内存管理等。本文聚焦于链表最核心的遍历与插入节点操作,通过清晰的图示和代码示例,深入剖析指针操作的顺序与常见错

weixin_34013044的博客 393

基于SSD2828和STM32的MIPI显示屏驱动系统设计与实现

在硬件层面,需要将STM32、SSD2828和MIPI显示屏连接起来。STM32与SSD2828的连接:通过SPI接口连接STM32和SSD2828,用于配置和控制SSD2828。SSD2828与MIPI显示屏的连接:通过MIPI DSI接口连接SSD2828和MIPI显示屏,用于传输显示数据。

qq_38334677的博客 7143

leetcode总结无止境系列之链表

链表是面试中十分容易考到的题目,一般代码比较短,而且考查面试者的思维全面性和写无bug代码的能力。在写链表的题目时,建议画出示意图,并把头结点、尾节点这些特殊的结点考虑在内。 主要的技巧就是要用dummy head,就是在链表头加一个节点指向head,这样可以避免判断头指针,统一处理所有情况,最后返回dummy->next;另外有一个跟dummy head等价的方法是用指针的指针**p去处理

Thinking 3594

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

链表 -- 环形链表1+2,合并2个/k个有序链表

链表算法题分析+代码 -- 环形链表1+2,合并2个/k个有序链表

m0_74206992的博客 162

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

牛客网剑指offer总结(一)(c++)

创建新链表存储合并后的链表,从头到尾循环读取两个链表每个结点的值并比较大小,按照排序顺序存储到新链表,当其中一个链表读取完毕,随后将另一个链表剩下未被读取的结点值直接存储到新链表即可。在旧链表的每个节点之后都添加一个结点,其新的结点值与旧链表的结点值相同,随后按照旧链表的链接方向,在新节点上进行链接,最后从中拆分出新链表即可。找到当前链表结点的前驱节点及后继节点,将当前节点的前驱节点与后继节点进行交换即可,循环整条链表的每个节点。借助一个数组,将链表结点值存放到这个数组中,随后将数组反向输出。

guet+第4组+2021 341

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python链表算法面试指南:高频题解与实战技巧

链表作为基础数据结构,通过节点指针实现动态内存管理,在插入删除操作上具有O(1)时间复杂度优势。其核心原理在于指针操作与边界条件处理,广泛应用于LRU缓存、环形检测等工程场景。针对技术面试需求,本文整理LeetCode高频链表题型,包含反转链表、环形检测等经典问题的Python实现,采用迭代/递归双解法,详细分析时间复杂度与空间复杂度。特别涵盖快慢指针、虚拟头节点等关键技术,以及白板编程中的常见错误规避方法,帮助开发者掌握链表问题的系统解决框架。

weixin_34258838的博客 332

数据结构与算法----学习笔记(4)链表实战部分

题型归纳: 链表的基本操作类 反转类 双指针问题 数学问题 碰到链表类题目,最好画图 常用技巧: 1.使用dummynode:在链表head之前添加一个虚拟头结点,即dummynode——>head,有了dummynode使得处理头结点和其他节点没有区别,简化了头结点的特殊情况 dummynode = Node(0) demmynode.next = head 2.双指针法:对于寻找链表的某个特定位置,或者判断是否有环等,可以用两个指针变量fast和slow,两个指针以不同的策略移动,知道两个指

qq_38055396的博客 303

LeetCode Hot 100——链表(三)

从零开始,用Java刷力扣 Hot 100,分享题解思路。今天是链表专题(三),三道题目——K个一组反转链表、随机链表的复刻、排序链表。

Jacob_611的博客 490

(三)算法与数据结构 | 单链表

算法与数据结构 | 单链表

Skies_的博客 445

2017好未来秋招笔试真题复盘:字符串处理、链表翻转与边界条件全解析

在计算机技术面试与校招笔试中,数据结构与算法始终是核心考察维度。字符串处理作为最基础的编程能力之一,常以频次统计、字符筛选等题型出现,考查对哈希表、遍历顺序和边界条件的理解;链表操作则通过指针移动与区间拼接,检验对节点引用和翻转逻辑的掌握。这些题型背后体现的是代码正确性、鲁棒性与复杂度优化能力,也是教育科技、互联网等各类企业筛选人才的通用标尺。无论是备考算法面试,还是应对秋招笔试,掌握字符串频次统计和链表K组翻转等原型题,都能有效提升解题效率。本文以好未来2017年秋招真题为样本,逐题拆解考点逻辑与考场思维

weixin_33980459的博客 445

C++实现多级双向链表扁平化:递归与迭代双解详解

链表是数据结构中的基础概念,用于存储线性数据。双向链表在单向链表的基础上增加了前驱指针,支持双向遍历。深度优先搜索(DFS)是一种重要的图遍历算法,常用于处理树形或嵌套结构。在工程实践中,将嵌套结构扁平化为线性序列是常见需求,例如处理多级菜单、文件目录树或复杂配置数据。本文以LeetCode 430题“扁平化多级双向链表”为例,深入剖析其核心原理与实现。通过递归法,可以直观地体现DFS思想,清晰处理层级嵌套;而迭代法则利用栈模拟递归过程,避免了潜在的栈溢出风险,更适合深度较大的场景。两种方法均需精细操作指针

weixin_33743248的博客 318

《剑指Offer》动态规划(一)

在此问题情境下,要把二叉搜索树通过特定的转换操作变成一个有序的双向链表,转换后的双向链表需按照二叉搜索树中节点值从小到大的顺序排列,且双向链表的表头是原二叉搜索树中的最小节点,表尾是原二叉搜索树中的最大节点。请注意,在实际应用中,如果不能保证一定存在出现次数超过一半的数字,还需要对结果进行进一步的验证(比如再次遍历数组统计返回数字的实际出现次数等操作),上述代码示例主要基于假设存在这样数字的前提进行实现展示。请注意,在实际应用中,对于输入参数的合法性检查等细节还可以进一步完善,确保程序的健壮性。

qq_40844444的博客 1321

携程2016研发笔试题详解:从数组指针到Java与Linux核心考点

技术面试的核心从来不是背诵八股,而是考察候选人对数据结构、算法和语言基础的真正理解。其中,数组和指针笔试题中的sizeof运算、Java笔试题常考的集合框架底层原理、Linux常用命令,都是研发岗位笔试中出现频率最高的知识点。理解这些概念背后的运行机制,不仅能帮助应对在线笔试中的选择题与编程题,更能为后续的系统设计和工程实践打下基础。以携程2016年研发工程师笔试题为样本,文章逐项拆解了数组与指针陷阱、Java String与HashMap原理、Linux文本处理命令、链表反转与二分查找等高频考点,并给出了

weixin_34235457的博客 308

【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

删除结点:1、2、4就地逆置:5、合并链表分解链表:10、11、去除重复元素:12、并集:14、15循环链表:17、18、19、20头插法、尾插法重点基础必掌握。判断是否有环:21。

m0_52427832的博客 1436

C 语言基础入门教程

本文系统梳理 C 语言核心知识,从程序结构、数据类型、流程控制到函数、数组、字符串与指针,覆盖初学者最常见的易错点。结合动态内存管理与代码组织实践,补充现代 C 写法与安全意识,帮助你从“会写语法”升级为“能写稳定、可维护代码”,适合作为入门到进阶的学习主线。

帅次的博客 11万+
上一篇: 操作系统处理机调度与死锁习题
下一篇: 操作系统三级调度相关习题
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值