Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4611774
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: C/C++

2006-11-10 17:34:31

链表(特别是单链表)的定位是链表这种数据结构的一个软肋所在,定位某一个元素你

就不得不通过遍历的方式获得。如果要寻找一个单链表的中间节点,普通的方法就是先遍历得到链表的长度,然后再通过长度遍历得到链表的中间节点。当然有一些链表通过一个特殊的头节点记录链表的长度的情况,可能要简单一些。

       前一段时间,在看链表的归并排序的时候,就不得不面临着寻找链表中间节点的问题。这里给出一种实现,很可能是大家想不到的:):

1)  使用两个指针进行遍历,快指针每次步进2,慢指针每次步进1;

2)  当快指针到达链表尾部的时候,慢指针指向的就是链表的中点。

这个算法的思想和经典问题“判定链表中是否存在环”的思想是一致的,但是如果不是

有启发,真的是很难想出来:)。

实现源码为:

//main.cpp

#include
#include
using namespace std;

struct node
{
       node* _next;
       int _data;
       node(int data):_next(NULL),_data(data)
       {

       }

};


node* InitData(int NUM)
{
       node* head = new node(-1);
       node* tmp = head;

       for (int i = 0; i < NUM; ++i)
       {
              head = head->_next = new node(i);
       }

       return tmp;
}


void Print(const node* head)
{

       while (head != NULL)
       {
              cout<_data<<" ";
              head = head->_next;
       }
       cout<
}

 

node* find_mid_element(node* head)
{

       if (NULL == head) return NULL;
       if (head->_next == NULL) return head;
       if (head->_next->_next == NULL) return head;
       node* mid= head;

       node* p = mid->_next;
       while ((NULL != p) && (NULL != p->_next))
       {

              mid = mid->_next;
              p = p->_next->_next;
       }

       return mid;
}

 

int main(int argc,char* argv[])
{

       node* h = InitData(1000);
       Print(h);

       node* m = find_mid_element(h);     

       if (m != NULL)
              cout<_data<       return 0;

}
 
 
阅读(3973) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-08 13:21:30

谢谢你的思路,我现在了解了,非常感谢!呵呵

chinaunix网友2008-11-08 13:21:30

谢谢你的思路,我现在了解了,非常感谢!呵呵