如何找链表的中间结点(快慢指针)

做回文链表的时候看到题解出现了快慢指针的概念,感觉很好玩,所以记录一下.

 在快指针的下一个结点和下下一个结点不为空(不要写错,本人写的时候就写错了,导致结果出现错误)的时候,快指针走两步,慢指针走一步.如果结点数是偶数个,我们会发现,慢指针会停在中间靠左的位置;如果是奇数个,慢指针会恰好停在中间位置.最后慢指针的值即为链表的中间结点.

注意:为什么(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;
}

不对之处希望大家指正,谢谢. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值