快慢指针
所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。
解题思路
快速找出未知长度的链表的中间节点,暴力解法就是先遍历真个链表,算出链表的长度,再从头遍历长度的一半,即可找出,不过这个比较费时。更巧妙的办法是运用快慢指针,将快慢指针先指向头结点,快指针移动2个步长,慢指针移动1个步长,当快指针指向链表末尾的时候,慢指针刚好就在中间节点上。
代码实现
1. 暴力解法
void Find_mid(LinkList L) {
LinkList p;
int count, mid;
int i = 0;
if (L == NULL) {
exit(ERROR);
}
p = L->next;
count = 0;
while (p) {
count ++;
p = p->next;
}
p = L->next;
mid = count / 2 ;
for (i = 0; i < mid; i++ )
{
p = p->next;
}
printf("%d\n", p->data);
}
2. 快慢指针
void Find_mid2(LinkList L) {
LinkList slow, fast;
if (L =