leetcode——链表的中间节点

leetcode——链表的中间节点_第1张图片
对于这道题,首先想到的最简单的思路就是统计节点的个数,再除以二就是中间节点的位置,但是这种思路比较麻烦,因此这道题采用快慢指针的思路。
分别定义两个指针同时指向头节点,一个是快指针fast,另一个是慢指针slow,两个指针顺着链表的顺序依次向后但是slow一次向后运行一个节点,fast一次向后运行两个节点,因此当fast把整个链表都跑完的时候,slow正好停在链表的中间节点,如图示例:
leetcode——链表的中间节点_第2张图片
如图所示两个指针按照要求一次向后访问链表,当fast指向最后一个结点的时候停止,此时slow指向的是中间节点,因此我们的判断条件是当fast->next=NULL时停止运行
但是这是节点个数为奇数时的情况,当节点个数是偶数时应该怎么办呢
leetcode——链表的中间节点_第3张图片
最后的情况是fast指向的是NULL时停止,因此此时的判断条件是fast=NULL时停止运行程序

struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast!=NULL&&fast->next!=NULL)
{
    slow=slow->next;//slow向后移动一位
    fast=fast->next->next;//fast向后移动两位
}
return slow;
}

千万要注意的一点:
在写while语句的判断条件时,一定要写成while(fast!=NULL&&fast->next!=NULL)
而不能将两个条件反过来,因为在判断条件的时候是从左向右判断的,如果fast=NULL,正常情况下判断完第一个条件就应该跳出循环,但是如果写反的话,第一步就是判断fast->next是否为NULL,但是fast本身就是NULL了,再进行fast->next操作系统会崩溃的喔!

你可能感兴趣的:(链表,leetcode,算法)