当前位置: 首页 > news >正文

【数据结构】链表中快指针和慢指针

目录

一、找出并返回链表的中间结点

二、输出链表中倒数第k个结点

三、判断链表中是否有环

四、两个单链表相交


一、找出并返回链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
要求:只遍历一遍链表

可以使用快慢指针:fast 一次走两步,slow 一次走一步。当 fast == NULL(偶数个结点)或者 fast->next == NULL(奇数个结点)就停止,返回 slow。

struct ListNode* middleNode(struct ListNode* head) 
{struct ListNode* slow, *fast; slow = fast = head; while(fast && fast->next){slow = slow->next; fast = fast->next->next;}return slow;
}

注意:

1、一次性定义多个指针时,第二个及以后的指针名前面都要加 * 。

2、while( )括号内是循环继续的条件。

二、输出链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。
要求:只遍历一遍链表

快慢指针:fast 先走 k - 1 步,然后 fast 和 sliow 同时走,直到 fast 走到链表的最后一个结点。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{struct ListNode* slow, *fast; slow = fast = pListHead;while(--k){fast = fast->next;}while(fast->next){slow = slow->next; fast = fast->next;}
}

三、判断链表中是否有环

给你一个链表的头节点 head ,判断链表中是否有环。

使用快慢指针:fast 一次走两步,slow 一次走一步。

bool hasCycle(struct ListNode *head) 
{   if(head == NULL)return false;if(head->next == NULL)return false;struct ListNode * slow = head;struct ListNode * fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow)return true;}return false;
}

注意循环的条件是 fast != NULL && fast->next != NULL。

四、两个单链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

要求:时间复杂度O(n),空间复杂度O(1)。

思路:1、分别求两个链表的长度 2、长的链表先走 差距步 3、同时走,第一个地址的结点相同就是交点

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* tailA = headA, *tailB = headB; int lenA = 1, lenB = 1; while(tailA->next){tailA = tailA->next; ++lenA;}while(tailB->next){tailB = tailB->next; ++lenB;}if(tailA != tailB)return NULL;int gap = abs(lenA-lenB); struct ListNode* longList = headA, *shortList = headB; if(lenA ‹ lenB){longList = headB; shortList = headA;}while(gap--){longList = longList->next;}while(longList != shortList){longList = longList->next; shortList = shortList->next;}return longList;}

http://www.lryc.cn/news/542459.html

相关文章:

  • 6_zookeeper集群配置
  • Docker核心概念
  • LD_PRELOAD 绕过 disable_function 学习
  • 如何用JAVA实现布隆过滤器?
  • 游戏开发 游戏开始界面
  • Python解析 Flink Job 依赖的checkpoint 路径
  • Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用
  • 计算机视觉算法实战——产品分拣(主页有源码)
  • 汽车软件︱AUTO TECH China 2025 广州国际汽车软件与安全技术展览会:开启汽车科技新时代
  • Visual Studio打开文件后,中文变乱码的解决方案
  • Python爬虫selenium验证-中文识别点选+图片验证码案例
  • MySQL后端返回给前端的时间变了(时区问题)
  • 计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)
  • 前端性能优化面试题及参考答案
  • 【NLP 37、激活函数 ③ relu激活函数】
  • 量子计算的威胁,以及企业可以采取的措施
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
  • Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
  • 使用PHP接入纯真IP库:实现IP地址地理位置查询
  • 计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
  • 无人机实战系列(三)本地摄像头+远程GPU转换深度图
  • 七.智慧城市数据治理平台架构
  • UE5从入门到精通之多人游戏编程常用函数
  • RK3399 Android7 Ethernet Tether功能实现
  • 【论文学习】基于规模化Transformer模型的低比特率高质量语音编码
  • Pretraining Language Models with Text-Attributed Heterogeneous Graphs
  • 什么是将应用放在边缘服务器上创建?应用不是在用户手机上吗?边缘计算究竟如何优化?通过两个问题来辨析
  • uni-app 系统学习,从入门到实战(二)—— 项目结构解析
  • 滴水逆向_引用_友元函数_运算符重载
  • java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正