题目链接:
力扣https://leetcode.cn/problems/middle-of-the-linked-list/
解题思路:
1. 这类题中新手常见的思路是先遍历一遍单链表求出链表的长度然后再除以 2 ,然后从头开始又
进行一次遍历操作找到中间结点,虽然可以执行,但是如果题目要求只进行一次遍历,那么这种算
法就不适用了
2. 我们可以用 “ 快慢指针 ” 的思路去求解。
先定义俩个指针变量,一个命名为 slow , 意为慢指针。另一个命名为 fast , 意为快指针。
用这俩个指针去进行遍历单链表,但是要求快指针的速度是慢指针的俩倍,
这样无论单链表的长度是奇数还是偶数,当快指针遍历到单链表末尾,注意此时并不是遍历的结束
信号,而是需要进一步访问指针域里的指针,确保此结点的下一个结点为NULL
即为 NULL 时,慢指针此时指向的结点便是中间结点
参考代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode *slow,*fast;
slow = head;
fast = head;
//fast的初始化尽量也设为head,防止单链表的长度为1的情况
while (fast && fast->next)
//使用&&的是因为不清楚单链表的长度是奇数还是偶数
{
slow = slow->next;
fast = fast->next->next;//可使fast的遍历速度是slow的俩倍
}
return slow;
}