目录
题目来源:
代码实现:
分析过程:
1、当链表元素为奇数个时:
2、当链表元素为偶数个时:
总结:
题目来源:
https://leetcode-cn.com/problems/middle-of-the-linked-list/description/
题目描述:
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_链表](https://file.cfanz.cn/uploads/png/2022/05/25/10/3b119cGF36.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_数据结构_02](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
代码实现:
struct ListNode* middleNode(struct ListNode* head){
struct ListNode*slow,*fast;
slow = fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_链表_03](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
分析过程:
1、当链表元素为奇数个时:
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_数据结构_04](https://file.cfanz.cn/uploads/png/2022/05/25/10/YYbDfA836M.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_数据结构_05](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
当链表元素为奇数个时,我们使用快慢指针,规定slow指针每次走一步,fast每次走两步,当fast->next为NULL时,slow所指向的指针就是该链表的中间元素。
2、当链表元素为偶数个时:
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_数据结构_06](https://file.cfanz.cn/uploads/png/2022/05/25/10/N4S6Q23M42.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_C语言_07](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
因为题目要求当链表有偶数个元素时,要求返回较后的中间结点,因此我们可以观察到,当fast为NULL时,slow所指向的元素即为链表元素为偶数个元素的中间结点。
总结:
当fast指针为NULL或者fast->next为NULL时,slow指针所指向的元素即为该链表的中间元素。
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_数据结构_08](https://file.cfanz.cn/uploads/png/2022/05/25/10/NccZY457XJ.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_C语言_09](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
需要注意的是:
while(fast&&fast->next)括号内fast和fast->next顺序不能互换,这是因为,&&操作符在判断的时候,会有执行顺序的先后,会先执行左边的语句,再执行右边的语句,在上述分析,当链表元素为偶数个时,fast走到最后时,fast为空,如果我们将fast->next写到左边先执行的话,必将造成空指针异常
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_C语言_10](https://file.cfanz.cn/uploads/png/2022/05/25/10/510eI6NQYa.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_链表_11](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_链表_12](https://file.cfanz.cn/uploads/png/2022/05/25/10/7514S20DX2.png)
![[ 链表OJ题] 用快慢指针解决链表中间值问题-链表的中间结点_C语言_13](https://file.cfanz.cn/uploads/gif/2021/09/18/17/58Y87YaF16.gif)
(本题完)










