zoukankan      html  css  js  c++  java
  • 快速找到未知长度单链表的中间节点

    普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。

     

    能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:设置两个指针* fast、*slow都指向单链表的头节点。其中* fast的移动速度是* slow的2倍。当* fast指向末尾节点的时候,slow正好就在中间了。

    C源代码如下:

    Java代码 复制代码 收藏代码
    1. void locate(LinkedList *head){ 
    2.       LinkedList *fast, *slow; 
    3.       fast=slow=head; 
    4.       while(fast->next!=NULL){ 
    5.               //fast的移动速度是slow的2倍 
    6.               if(fast->next->next!=Null){ 
    7.                       fast=fast->next->next; 
    8.                       slow=slow->next; 
    9.               }else
    10.                     fast=fast->next; 
    11.               } 
    12.       } 

    另外,快慢指针在解决单链表环问题的时候是非常有用的,具体请参见《★经典问题—链表中的环问题

  • 相关阅读:
    圆上的整点
    学习笔记:用线性筛算不太常见的函数
    解题报告: luogu P1972
    解题报告: luogu P3907
    替罪羊树详解
    解题报告:luogu P2787
    解题报告:luogu P4170
    解题报告:luogu P4933
    10、.运维就是一场没有硝烟的战争
    九、模板层(三)
  • 原文地址:https://www.cnblogs.com/ihada/p/1982022.html
Copyright © 2011-2022 走看看