题目表述
给你单链表的头结点 head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
这道题的思路是快慢指针,具体来说就是定义两个指针,一快一慢,快指针一次走两步,慢指针一次走一步,当快指针走到末尾时,慢指针所指向的结点即为中间结点。具体来说,还要细分为两种情况,一种情况是有奇数个结点,另一种情况是有偶数个结点,请看图:
奇数个结点:
偶数个结点:
因此,综合以上两种情况,当fast指向结点的val==NULL或者fast==NULL时,这时的slow即为所求中间结点。
完整代码如下:
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow=head;
struct ListNode* fast=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}