首先我们要知道题目的原理
若例题为
1 2 3 4 5
那么我们就返回3
若 1 2 3 4 5 6
那么我们返回4
所以我们要考虑到两种情况
第一种 链表的长度为奇数 我们自己返回中间的节点
第二种 链表的长度为偶数 我们就返回长度/2+1的节点
这里有两种的解题方法
第一种思路
我们先计算链表的长度
然后我们再把链表长度/2+1(两种情况都一样)
解释 因为如果链表为 1 2 3 4 5 长度为5(奇数) 5/2+1=3 当i==1时 指针刚好移动到3的位置
如果链表为 1 2 3 4 5 6 长度为6(偶数)6/2+1=4 当i==1时 指针刚好移动到4的位置
所以就可以写出
当i==1时 退出循环 返回指针
当i!=1时 i-- 指针向后移动 直到i==1位置
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* cur=head;
struct ListNode* end=head;
int i=0;
int count=0;
while(cur)
{
count++;
cur=cur->next;
}
i=count/2+1;
while(end)
{
if(i==1)
{
break;
}
else
{
end=end->next;
i--;
}
}
return end;
}
第二种思路
利用快慢指针的思路
让slow和fast同时指向头
slow一次走一步 fast一次走两步
当fast走到最后或者空时
slow刚好走到了中间的位置(不管长度是奇数还是偶数)
最后返回slow
这个思路很厉害 当也很难想到的一种
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* slow=head;
struct ListNode* fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}