Chinaunix首页 | 论坛 | 博客
  • 博客访问: 606920
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类: 系统运维

2012-09-17 08:45:33

http://www.cnblogs.com/ihada/archive/2011/03/12/1982022.html快速找到未知长度单链表的中间节点

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

 

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

C源代码如下:

  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.       } 
阅读(609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~