题目描述
思路
方法一:
- 当个数为奇数个时[1,2,3,4,5],中间结点是第5/2+1
- 当个数为偶数个时[1,2,3,4],(要求如果有两个中间结点要求返回第二个),中间结点是4/2=2,为第2,3个,要第二个那就是4/2+1。
但是这样要遍历一遍计算链表长度,然后根据算出的长度求中间结点,要遍历两遍。
方法二:
- 利用快慢指针,快指针每次走两步,慢指针每次走一步。如图所示:
奇数情况:当fast->next=null,结束;
偶数情况:当fast=null结束;
代码
struct ListNode* middleNode(struct ListNode* head)
{
//定义快慢指针,slow每次走一步,fast每次走两步
//奇数个结点:fast->next为空时结束
//偶数个结点:fast=nulL结束
//最后slow的位置就是中间结点
struct ListNode* slow=head;
struct ListNode* fast=head;
//进入循环条件,fast,fast->next都不为空,当有一个为空,说明结束了
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}