做回文链表的时候看到题解出现了快慢指针的概念,感觉很好玩,所以记录一下.
在快指针的下一个结点和下下一个结点不为空(不要写错,本人写的时候就写错了,导致结果出现错误)的时候,快指针走两步,慢指针走一步.如果结点数是偶数个,我们会发现,慢指针会停在中间靠左的位置;如果是奇数个,慢指针会恰好停在中间位置.最后慢指针的值即为链表的中间结点.
注意:为什么(fast->next!=NULL&&fast->next->next!=NULL)要写两个条件呢?刚开始我也有疑问,最后我发现如果只写(fast->next->next!=NULL)当结点数是奇数个的时候,快指针最终指向最后一个结点,判断fast->next->next是不是等于NULL,会略过fast->next,而fast->next已经是NULL了,访问fast->next->next将会导致访问一个不存在的节点,从而引发运行时错误。因此,保留fast->next!=NULL条件是必要的,它确保了在访问ast->next->next之前,fast->next不是NULL,从而避免了访问非法内存的风险。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode* List; //不想写的麻烦所以用typedef,不过还是建议慎用,因为可能名字一多会
搞不清楚
List findMid(List head){
List slow = head;
List fast = head;
while(fast->next!=NULL&&fast->next->next!=NULL){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
不对之处希望大家指正,谢谢.