文章目录
链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
题目来源
思路一:
计算链表长度
长度除于2为寻找中间结点的循环变量
通过画图和计算,我们很容易就能超出规律
并按此思路写出如下代码
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* tmp=head;
int count =0;
while(tmp)
{
count++;
tmp=tmp->next;
}
count/=2;
while(count--)
{
head=head->next;
}
return head;
}
思路一的时间复杂度为O(N) = N+N/2=1.5N
先遍历一遍,然后再遍历半遍
思路二:
快慢指针
fast 快指针每次走两步
slow 慢指针每次走一步
fast 的速度是slow的两步
那么当fast走到尾时,slow刚刚好走到中间
通过画图分析
我们指针
当fast== NULL或fast->next==NULL
时,为迭代的结束条件
struct ListNode* middleNode(struct ListNode* head){
if(head==NULL||head->next==NULL)
{
return head;
}
struct ListNode*fast=head;
struct ListNode*slow=head;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}