每日一题(链表的中间节点)
思路:
如下图:可以定义两个结构体指针均从链表的头节点开始向后遍历,fast指针一次走两步,slow指针一次走一步,fast指针的速度永远是slow指针速度的两倍。根据链表的个数的奇偶性可以将情况分为两种:
情况一:当链表的个数为奇数个时(如下图),直到fast走到尾节点时,此时slow节点就是链表的中间节点。
情况二:当链表的个数为偶数个时(如下图),直到fast为空指针时,此时的slow节点就是链表的中间节点。
注意:
- 只要链表的个数是奇数个,那么fast一定会走到尾节点,不会走到空指针处。
- 只要链表的个数是偶数个,那么fast一定会走到空指针处,不会走到尾节点。
由于我们无法知晓链表个数的奇偶性,所以当fast只要走到了尾节点或空指针处,此时的slow一定就是链表的中间节点。
代码实现:
struct ListNode* middleNode(struct ListNode* head){ struct ListNode* fast= head; struct ListNode* slow = head; while((fast)&&(fast->next)) { fast = fast->next->next; slow = slow->next; } return slow; }
完结
链表的中间节点题目的分析就到这里啦,若有不足,欢迎评论区指正,下期见!