转载自:http://blog.csdn.net/cnnumen/article/details/5734316
链表(特别是单链表)的定位是链表这种数据结构的一个软肋所在,定位某一个元素你
就不得不通过遍历的方式获得。如果要寻找一个单链表的中间节点,普通的方法就是先遍历得到链表的长度,然后再通过长度遍历得到链表的中间节点。当然有一些链表通过一个特殊的头节点记录链表的长度的情况,可能要简单一些。
前一段时间,在看链表的归并排序的时候,就不得不面临着寻找链表中间节点的问题。这里给出一种实现,很可能是大家想不到的:):
1) 使用两个指针进行遍历,快指针每次步进2,慢指针每次步进1;
2) 当快指针到达链表尾部的时候,慢指针指向的就是链表的中点。
这个算法的思想和经典问题“判定链表中是否存在环”的思想是一致的。
int getMid(PTRNODE head)
{
if(head == NULL)
return -1;
PTRNODE ptrOneStep = head;
PTRNODE ptrTwoStep = head->next;
while(ptrTwoStep != NULL && ptrTwoStep->next != NULL) //注意两个条件不能换位置;
{
ptrOneStep = ptrOneStep->next;
ptrTwoStep = ptrTwoStep->next->next;
}
return ptrOneStep->value;
}