目录
题目来源:
876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com)
题目描述:
代码实现:
struct ListNode* middleNode(struct ListNode* head){
struct ListNode*slow,*fast;
slow = fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
分析过程:
1、当链表元素为奇数个时:
当链表元素为奇数个时,我们使用快慢指针,规定slow指针每次走一步,fast每次走两步,当fast->next为NULL时,slow所指向的指针就是该链表的中间元素。
2、当链表元素为偶数个时:
因为题目要求当链表有偶数个元素时,要求返回较后的中间结点,因此我们可以观察到,当fast为NULL时,slow所指向的元素即为链表元素为偶数个元素的中间结点。
总结:
当fast指针为NULL或者fast->next为NULL时,slow指针所指向的元素即为该链表的中间元素。
需要注意的是:
while(fast&&fast->next)括号内fast和fast->next顺序不能互换,这是因为,&&操作符在判断的时候,会有执行顺序的先后,会先执行左边的语句,再执行右边的语句,在上述分析,当链表元素为偶数个时,fast走到最后时,fast为空,如果我们将fast->next写到左边先执行的话,必将造成空指针异常
(本题完)