IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【力扣刷题】双指针在数组、链表中的妙用 -> 正文阅读

[数据结构与算法]【力扣刷题】双指针在数组、链表中的妙用

在刷力扣的时候是按照代码随想录的顺序刷的,在刷前两章数组和链表时发现双指针法是一种经常用到,但是有时不知道该咋用的方法。文中有许多都是引用代码随想录的内容,仅做记录,并非完全原创,只是为了供自己也供大家整理并做个参考。

目录

1. 双指针从两边向中间移动

① 如力扣977题有序数组的平方(附上链接:代码随想录)

?② 类似快速排序算法的双指针也可能解决某些数组或链表问题:

2. 双指针从头一起开始

如力扣206.反转链表(代码随想录)

?3. 快慢指针法

① 如27. 移除元素(代码随想录)

?② 环形链表(代码随想录)

③?滑动窗口:209.长度最小的子数组(代码随想录)


双指针法展现出效率的优势:通过两个指针在一个for循环下完成两个for循环的工作。

双指针法有以下几种常见类型:

1. 双指针从两边向中间移动

① 如力扣977题有序数组的平方(附上链接:代码随想录

????????比较两个指针指的数大小,选出大的存入另个数组

?② 类似快速排序算法的双指针也可能解决某些数组或链表问题:

已知带头结点的双向循环链表头结点指针为list,除头结点外的每个链结点数据域值为一个整数。请写一算法,将链表中所有数据域值大于0的结点放在所有数据域值小于0的结点之前。若链表中除头结点外没有其他结点,算法返回0,否则,算法返回1。

/*设置两个指针变量p和q,初始时,p指向头结点右面那个结点,q指向头结点左面那个结点
(链表最右边那个结点)。然后,指针p从左向右扫描链表,查找数据域值小于0的结点,
而指针q从右向左扫描链表,查找数据域值大于0的结点。
若此时p指结点不是q指结点右面那个结点,交换两结点的数据域值,直到链表满足条件*/

int DMOVE(DLinkList list){
    DLinkList p = list-> rlink, q = link->llink;
    int temp;
    if(p == list)
        return 0;
    while(p != q){
        while(p->data > 0 && p != list)
            p = p->rlink;
        while(q->data < 0 && q != list)
            q = q->llink;
        if(q->rlink != p){
            temp = p->data;
            p->data = q->data;
            q->data = temp;
            p = p->rlink;
            q = q->llink;
            if(q->rlink == p || ( p == list && q == list))
                return 1;
        }
        else
            return 1;
    }
}

2. 双指针从头一起开始

这在单链表中很常见。设置一个cur,pre记录他的前一个结点,中间可能还需要temp来保存某中间结点。

如力扣206.反转链表(代码随想录

?3. 快慢指针法

这是一种非常有技巧性的方法,也是比较难想到的高阶方法,非常巧妙。

① 如27. 移除元素(代码随想录

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

?② 环形链表(代码随想录

分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。

?从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

③?滑动窗口:209.长度最小的子数组(代码随想录)

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:39:02  更:2022-10-22 21:39:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/16 18:08:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码