题目
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/description/
分析
在这里我们讲解一种在链表中最常用也是十分经典的解决办法————快慢指针
我们先举出我们在高中学过的例子,追击相遇的题目,自行车的速度是4m/s,电动车的速度是8m/s,两辆车同时从桥的起点出发,问:当电动车通过桥的终点时,自行车处在什么位置?
相信大家都快脱口而出,当电动车通过桥的终点时,自行出处于桥的中间位置
那么这种思想在计算机中也同样可以使用,面对这道题目,当我们想要寻找到当前链表的中间结点时,我们可以创建两个指针,一个指针的每一次移动的速度是另一个指针的移动速度的两倍,那么当我们的快指针先遍历链表结束时,慢指针正好移动到快指针的路程的一半,也就是链表的中间结点。
那么我们解决这道题的思路就是,我们创建两个指针,slow、fast;slow指针每一次移动一个单位距离slow = slow->next;fast指针每一次移动两个单位距离fast = fast->next->next 但我们要注意我们在遍历链表时的限制条件,因为当 我们在遍历时可能fast->next就已经指向NULL,所以我们要注意我们的遍历限制条件。
代码
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* slow = head;
struct ListNode* fast = head;
while(fast && fast->next)//判断条件尤其注意,既要保证我们fast还要保证fast->next不为NULL。这里我们不写fast->next->next是因为当我们的fast->next == NULL,fast->next->next必定为NULL
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
总结
快慢指针在我们数据结构中的链表问题经常使用,也是十分经典的解决方法,在后面的问题中会经常使用,在后面我也会继续分析与记录
以上就是我对这种方法的个人理解
上述内容如果有错误的地方,还麻烦各位大佬指教【膜拜各位了】【膜拜各位了】