快慢指针查看单链表的中间值
单链表的实现:https://blog.youkuaiyun.com/weixin_43290957/article/details/106465659
普通方法:首先遍历一遍获取总长度L,然后再次遍历循环至L/2即可;时间复杂度为:O(L+L/2)=O(3/2L)
快速方法:快慢指针法,设置2个指针faster,mid都指向单链表的头节点,其中faster移动的速度为mid的2倍,当faster移动到末尾,mid即在中间位置了,以下是简单实现:
/**
* @description: 快慢指针获取中间值
* @param {LinkList L: 结构体一级指针}
* @param {ElemType* data: 获取到的中间元素}
* @return: 链表个数为单数返回慢指针的数据域数据
* @return: 链表个数为双数返回中间两个数的平均数
*/
Statue fasterGetElement(LinkList L, ElemType* data)
{
LinkList mid, faster; // 慢指针, 快指针
mid = L->next; //获取到头结点
faster = L->next; //获取到头结点
while(faster && mid){
//链表结点个数为单数
if(faster->next == NULL)
return mid->data;
//链表结点个数为双数, 返回中间两个值的平均(取整)
else if(faster->next != NULL && faster->next->next == NULL)
return (mid->data + mid->next->data) / 2;
else{
faster = faster->next;
faster = faster->next;
mid = mid->next;
}
}
}