3种解法 - 定位单链表的中间节点
发布日期:2021-05-08 16:54:52 浏览次数:21 分类:精选文章

本文共 1067 字,大约阅读时间需要 3 分钟。

单链表中间结点的寻找问题

问题描述

给定一个带有头结点 head 的非空单链表,要求返回链表的中间结点。如果链表有偶数个结点,则返回第二个中间结点。例如:

  • 示例1:输入 [1,2,3,4,5],输出结点 3,序列化形式为 [3,4,5]
  • 示例2:输入 [1,2,3,4,5,6],输出结点 4,序列化形式为 [4,5,6]

解法三:快慢指针技术

思路概述

快慢指针技术是一种高效的链表操作方法,常用于寻找链表的中间节点。具体步骤如下:

  • 初始化指针:使用两个指针 slowfast,均指向链表的头结点 head
  • 移动指针:同时开始移动指针,fast 指针每移动两步,slow 指针移动一步。这种方式确保 fast 指针总是比 slow 指针提前移动一步。
  • 终止条件:当 fast 指针到达链表的末尾时,即 fast.next 为空,停止移动。
  • 返回结果:此时,slow 指针正好位于链表的中间位置。如果链表长度为偶数,返回第二个中间结点。
  • 详细步骤

  • 初始化指针

    slow = headfast = head
  • 移动指针

    while fast != None and fast.next != None:    fast = fast.next.next    slow = slow.next
    • fast 指针每次移动两步,slow 指针移动一步。
    • fast 到达链表末尾时,slow 指针位于中间位置。
  • 返回结果

    return slow
    • 无论链表长度是奇数还是偶数,slow 指针都指向正确的中间结点。
  • 优点分析

    • 时间复杂度:O(n),因为只需遍历链表一次。
    • 空间复杂度:O(1),仅使用常数空间。

    实际应用示例

    • 示例1:链表 [1,2,3,4,5]

      • 初始:slowfast 都指向 1
      • 第一次循环:fast 到达 3slow 到达 2
      • 第二次循环:fast 到达 5slow 到达 3
      • fast 到达末尾,返回 slow3
    • 示例2:链表 [1,2,3,4,5,6]

      • 初始:slowfast 都指向 1
      • 第一次循环:fast 到达 4slow 到达 2
      • 第二次循环:fast 到达 6slow 到达 3
      • 第三次循环:fast 到达末尾,返回 slow4

    总结

    使用快慢指针技术是高效且简洁的解决方案,能够在 O(n) 时间和 O(1) 空间复杂度内找到链表的中间结点,适用于各种长度的链表,包括奇数和偶数节点的情况。这种方法不仅代码简洁,而且在实际应用中表现优异。

    上一篇:2种解法:斐波那列马甲问题
    下一篇:3种解法 - 得到使数组唯一的最小增量

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月28日 02时15分24秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Linux学习总结(66)——CentOS7操作系统SSH安全加固 2023-02-03
    Linux学习总结(67)——shell脚本中$0 $1 $# $@ $* $? $ 等总结 2023-02-03
    Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git 2023-02-03
    Linux学习总结(69)——Linux 生成随机数的6种方法 2023-02-03
    Linux学习总结(6)——CenterOS7安装mysql5.5的方法 2023-02-03
    Linux学习总结(6)——CenterOS7安装mysql5.5的方法 2023-02-03
    Linux学习总结(70)——Bash 脚本中常用的内置变量汇总 2023-02-03
    Linux学习总结(71)——Linux 管理面板哪家强?云帮手、APPNODE 还是宝塔? 2023-02-03
    Linux学习总结(72)——Linux系统安全加固 2023-02-03
    Linux学习总结(73)——Linux高频命令大总结 2023-02-03
    Linux学习总结(74)——wget 命令详解 2023-02-03
    Linux学习总结(75)—— Linux history 命令实用技巧 2023-02-03
    Linux学习总结(76)—— Shell 脚本日志技巧 2023-02-03
    Linux学习总结(77)—— Shell 开发运维经验总结 2023-02-03
    Linux学习总结(78)—— 常见开源协议讲解 2023-02-03
    Linux学习总结(79)—— Shell 编程规范 2023-02-03
    Linux学习总结(7)——阿里云centeros服务器上安装 jdk,tomcat,mysql 2023-02-03
    Linux学习总结(7)——阿里云centeros服务器上安装 jdk,tomcat,mysql 2023-02-03
    Linux学习总结(80)—— 开发人员最常用的 Linux 命令总结 2023-02-03
    Linux学习总结(81)—— Linux 权限详解 2023-02-03