双指针技巧之快慢指针
时间:2021-07-25
本文章向大家介绍双指针技巧之快慢指针,主要包括双指针技巧之快慢指针使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
双指针技巧分为两类:快慢指针
和左右指针
,前者主要解决链表中的问题,后者用来解决数组和字符串问题,下面将详细介绍快慢指针.
快慢指针的常用算法
快慢指针初始化时一般指向链表的头结点head
,快指针fast
在前,一次走两步,慢指针slow
在后,一次走一步。
快慢指针典例1:判断链表中是否有环
我们很容易会想到一个方法:通过判断指针的下一结点是否为空,来判断链表中是否含环
bool hasCycle(LinkList* head){
Linklist* p = head;
while(p){
p = p->next;
}
return false; //如果p为空,则链表有环
}
但是,如果链表中有环时,while会陷入死循环,因为环形链表中没有NULL
指针作为尾部结点,所以单指针的方法是行不通的,这就需要我们用双指针中的快慢指针来解决。
快慢指针中,快指针一次走两步,慢指针一次走一步。如果链表不含环,快指针最终会指向NULL
,说明链表不含环;如果含有环,快指针最终会追上慢指针,两者相遇,说明链表含环。
bool hasCycle(ListNode* head){
ListNode* fast, * slow; //定义快、慢指针
fast = slow = head; //初始化时快、慢指针指向头结点
while(fast && fast->next){ //循环条件:fast不为NULL 且 fast->next不为NULL(主要是为了下句代码fast->next->next不出现空指针异常)
fast = fast->next->next; //快指针一次走两步
slow = slow->next; //慢指针一次走一步
if(fast == slow) return true; //快指针追上慢指针,两者相遇,说明链表含环。
}
return false; //快指针指向```NULL```或者快指针的下一结点为```NULL```,说明链表不含环
}
LeetCode 141. 环形链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* fast, * slow;
fast = slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast == slow) return true;//若快慢指针相遇,则表示链表中有环
}
return false;//快指针为空或者快指针的下一结点指向空,则表示链表中没有环
}
};
原文地址:https://www.cnblogs.com/keyongkang/p/15057287.html
- [译]Laravel 5.0 之自定义错误页面
- 使用Google的Quickdraw创建MNIST样式数据集!
- CentOS 7 开启 BBR 加速
- 开源项目Minio:提供非结构化数据储存服务
- [译]Laravel 5.0 之事件自动生成
- [译]Laravel 5.0 之 Eloquent 属性转换
- [译]Laravel 5.0 之事件及处理程序
- 自相关与偏自相关的简单介绍
- [译]Laravel 5.0 之命令及处理程序
- Deep Photo Styletransfer的一种纯Tensorflow实现,教你如何转换图片风格
- 如何提前体验 Laravel 5.5
- Laravel 4 小技巧两则
- [译]Laravel 5.0 之 ValidatesWhenResolved
- Python机器学习的练习七:K-Means聚类和主成分分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular开发文档中一些常用的词汇
- Angular应用里child Component如何向parent Component发送事件
- 如何在SAP WebClient UI里使用jChartFX
- Go语言|基于channel实现的并发安全的字节池
- 对于hashmap的一点理解
- IntelliJ IDEA 2020.2 破解
- MATLAB批量给数据集加雾
- Vue Cli 4 引入 Cesium 配置
- R语言在不同样本量下的Littles MCAR检验
- Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW
- R语言基于协方差的SEM结构方程模型中的拟合指数
- Python贝叶斯回归分析住房负担能力数据集
- 基于R统计软件的三次样条和平滑样条模型数据拟合及预测
- R语言析因设计分析:线性模型中的对比
- R语言逻辑回归、方差分析 、伪R平方分析