浅谈快慢指针

浅谈快慢指针快慢指针 1 快慢指针的概念 快慢指针就是存在两个指针 一个快指针 一个慢指针 两个指针每次移动的速度不一样 快的移动的快 慢的移动的慢 快慢指针中的快慢指的是移动的步长 即每次向前移动速度的快慢 例如可以让快指针每次沿链表向前移动 2 慢指针每次向前移动 1 次 2 快慢指针的应用 判断单链表是否为循环链表如果链表是单纯的环形链表我们的代码可以是这样的 boolisCLinkL List Head List p Head while p p p

快慢指针

1.快慢指针的概念:

快慢指针就是存在两个指针,一个快指针,一个慢指针,两个指针每次移动的速度不一样,快的移动的快,慢的移动的慢。快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

2.快慢指针的应用:

1. 判断单链表是否为循环链表

如果链表是单纯的环形链表我们的代码可以是这样的: javascript bool isCLinkList(List *Head) { List *p = Head; while(p) { p = p->next; if(p == Head) { return true; } } return false; } 

但是仔细一想这种办法只能判断链表为圆形的那种环形链表,就是头尾相连的那一种。

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

定义两个指针,一个快指针,一个慢指针,快指针每次前进两步,慢指针每次前进一步,如果快指针追上了慢指针则说明这个链表是环形链表,如果没追上,则证明这个链表就是单链表。

快慢指针就好像两个人在赛跑,如果是在一个环形的跑道中,那么他们一直跑下去的话,快的就肯定能追上慢的,而且最少比慢的多跑了一圈。快慢指针判断环形链表就是这样的情况。

2. 在有序链表中寻找中位数

int GetMedian(List *head) { 
    List *fast = *slow = head; while(fast && slow){ 
    if(fast == NULL){ 
    return slow -> data; }else if(fast -> next == NULL){ 
    return (double)(slow -> data + slow -> next -> data) / 2; }else{ 
    fast = fast -> next -> next; slow = slow -> next; } } } 

3.链表中倒数第k个节点

struct ListNode* getKthFromEnd(struct ListNode* head, int k){ 
    if (k == 0 || head == NULL) { 
    return NULL; } struct ListNode *p = head; struct ListNode *q = head; int i; for (i = 0; i < k - 1; i++) { 
    p = p -> next; if (p == NULL) { 
    return NULL; } } while (p -> next != NULL) { 
    q = q -> next; p = p -> next; } return q; } 

这就是我本周分享关于快慢指针的内容,快慢指针在平时的应用最多的就是这三种题型,但是还有很多也可以应用快慢指针的思想,希望对大家有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208579.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:15
下一篇 2026年3月19日 上午11:15


相关推荐

  • [linux] linux 复制文件夹/文件到指定位置 cp -r和cp -r -d[通俗易懂]

    1.cp-r移动子目录和根目录到指定文件夹将test文件夹移动到video内!cp-r./test./video操作后存在./video/test2.cp-r-d移动所有子目录到指定文件夹将所有子目录移动到指定位置如structuring内存在a,b,c,三个文件夹./structuring/a./structuring/b./structuring/c!cp-r-d./structuring/*./则操作后存在./a./b./c…

    2022年4月13日
    96
  • 阿里云centos镜像下载

    阿里云centos镜像下载下载地址:http://mirrors.aliyun.com/centos/这个界面提供了centos各个版本的目录,不过,点入具体的目录去只有一个readme文件,而没有镜像下载。readme文件中提供了精确版本的下载地址:http://vault.centos.org/,以6.8版本为例,可以根据信息一步一步找到需要的镜像文件这个地址是可以下载的,不过下载速度相对比较慢,针对网络比较差的环境,下载这个镜像简直就是折磨。回到最开始的阿里云镜像目录,点击7和8的根目录可以找到相关的镜像通过目录iso

    2022年6月3日
    65
  • linux查看redis安装目录&查看redis端口占用

    linux查看redis安装目录&查看redis端口占用如果命令 which 和 whereis 都找不到安装目录 可使用以下办法 ps ef grepredis 得到了进程号 xxxx 然后 ls l proc xxxx cwd

    2026年3月20日
    2
  • SQLite下载、安装和使用并Qt链接SQLIte全部教程(windows)

    SQLite下载、安装和使用并Qt链接SQLIte全部教程(windows)第一步 下载 SQLIte 下载地址 https www sqlite org download html 下载两个内容 sqlite dll win64 x64 3360000 zipsqlite tools win32 x86 3360000 zip 下载完后直接解压 放到到一个文件夹下 这个文件夹可以随便在哪里 如下图 第二步 使用 SQLite 网上好多教程都是到这一步就配置环境变量 不知道他们脑子咋想的 轻量级数据库 SQLIte 本来就应该随着项目到处走 直接在解压且合并后

    2025年7月21日
    5
  • TraceID和ThreadLocal简介

    TraceID和ThreadLocal简介TraceID 分布式产品查日志太麻烦 多台机器之间查来查去 还不知道是不是同一个请求的 打印日志时使用 MDC 在日志上添加一个 traceId 标示一次调用的上下文 ID 通过此 ID 可以获悉你所做事情的足迹链 MDCMDC MappedDiagno 是一个映射 用于存储运行上下文的特定线程的上下文数据 因此 如果使用 log4j 进行日志记录 则每个线程都可以拥有自己的 MDC 该 MDC 对整个线程是全局的 属于该线程的任何代码都可以轻松访问线程的 MDC 中存在的值

    2026年3月17日
    2
  • 【教程】2026年OpenClaw(Clawdbot)阿里云9分钟安装集成Skill喂奶级方法

    【教程】2026年OpenClaw(Clawdbot)阿里云9分钟安装集成Skill喂奶级方法

    2026年3月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号