千家信息网

C语言双指针算法怎么用

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇"C语言双指针算法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C语言双指
千家信息网最后更新 2025年11月09日C语言双指针算法怎么用

这篇"C语言双指针算法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C语言双指针算法怎么用"文章吧。

双指针

首先咱得知道何为双指针,听起来很上流,其实有手就行。

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

换言之,双指针法充分使用了数组有序这一特征,当遇到有序数组时,应该优先想到双指针来解决问题,因两个指针的同时遍历会减少空间复杂度和时间复杂度从而在某些情况下能够简化运算

对撞指针

类似于相遇问题,对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针,最右侧的定义为右指针,然后分别从两侧出发,相向遍历链表,这个过程就形象化为对撞,习惯上就将左右指针定义为 left 和 right,我们给出一个大致代码逻辑:

void hit(int *arr,int arrsize){int* left = arr;int* right = arr + arrsize -1;while(left<=right){条件语句;left++;条件语句;right--;}}

对撞指针适用于二分查找,链表对象求和等,也就是说当你遇到题目给定有序数组时,应该第一时间想到的思路就是使用对撞指针。

快慢指针

类似于龟兔赛跑,快慢指针是两个链表上的指针从同一节点出发,其中一个指针前进速度比另一个快,两个指针以不同的策略移动,直到两个指针的值达成某个条件为止,如图(ppt绘图+手残勿喷):

我们同样将左右指针定义为 slow,fast,要实现其中一个指针比另一个快,我们无可厚非就两种方法:

1.同时起步,fast 比 slow 多走n步;

2.fast 先走,slow后走;

那我们给出他的逻辑代码:
同时走:

void speed(int *arr){   int* fast = arr;   int* slow = arr;   while(slow

先后走:

void speed(int *arr){int* slow =arr;int* fast = arr;while(条件1){slow++;}while(条件2){fast++;}}

真题实战

1.调整数组顺序使奇数位于偶数前面

int* reOrderArray(int* array, int arrayLen, int* returnSize ) {  *returnSize = arrayLen;   int* left = array;        int* right = array + arrayLen - 1;        while (left < right)//(1)        {                while (left < right && *left % 2 == 1)//(2)                        left++;                while (left < right && *right % 2 == 0)//(3)                        right--;                if (left < right)//(4)                {                        int tmp = *left;                        *left = *right;                        *right = tmp;                }                left++;                right--;        }        return array;}

这道题就是典型的对撞指针,我们遍历完整个数组时,左右指针路程各自一半,只需要 left 寻找奇数,right 寻找偶数做交换即可。

==Ps.==这里的* returnSize

2.Leetcode 真题:移除元素

int removeElement(int* nums, int numsSize, int val) {        int* p1 = nums;        int* p2 = nums;        int sz = numsSize;        for (; p1 < nums + numsSize; p1++)        {                if (*p1 != val)                {                        *p2 = *p1;                        *p2++;                }                else                        sz--;        }        return sz;}

这是典型的快慢指针,第一个指针用来遍历数组元素,判断是不是要删除的数,第二个指针用来存放数字。如果第一个指针指向的是要删除的元素,那么输出用来存放输出数组元素个数的整形变量sz就自减 1,然后第一个指针向后移动一位,第二个指针不动;如果第一个指针指向的不是要删除的数,那么就把这个数放到第二个指针指向的位置,然后第一个指针和第二个指针都向后移动一位。重复操作直到第一个指针遍历整个数组,此方法的时间复杂度是O(n)。

以上就是关于"C语言双指针算法怎么用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

指针 数组 条件 两个 内容 有序 元素 快慢 指向 算法 语言 复杂 同时 复杂度 就是 移动 个数 代码 偶数 典型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 拒做网络安全俘虏讨论发言 影子科技互联网公司 软件开发课程总结文案 网络安全审查办法中关键信息基础 数据库怎么设计一个网站 大学生网络安全新闻稿 网络技术与经济的结合 网络技术绩效考核表 用vs连接数据库 微信小程序流媒体服务器 泰安乐谌互联网科技有限公司 初中生网络安全教育第5节 网络安全宣传周网站 ibm服务器 8核 硬盘接口用于高端服务器 网络安全的一般特征是什么 关于网络安全的一些事件 温州正规软件开发来电咨询 gerrit服务器管理 网络安全问题日益重要英文 芜湖软件开发培训怎么选 中小学生网络安全教育简报 无锡工程软件开发哪家好 我的世界国际版有没有中国服务器 云服务器如何调成中文 大邑网络安全周 什么描述数据库的全局逻辑结构 安徽省民用枪支管理服务器网站 数据库软件多少钱一个 税控盘显示正在上传数据库
0