补充上次的环形链表没细讲的快慢指针(这三道题现在可以连起来看),希望对你做题思路有帮助
876.链表的中间结点
题目
给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文字 和 画图 分析
这里用到快慢指针的思想
定义两个指针,一个是 fast指针,另一个是 slow指针,让它们都指向头指针的地址,并且 fast指针 每次都走两步,slow指针 每次都走一步,当 fast指针 走完整个链表,slow指针 只走了它的一半(即中间节点)
这里分两种情况(链表长度为偶数 和 链表长度为奇数):
- 链表长度为偶数:
结束条件:fast = NULL
2. 链表长度为奇数:
结束条件: fast->next = NULL
综上:这个循环进行的条件是 fast && fast->next
代码
struct ListNode* middleNode(struct ListNode* head) { struct ListNode*slow = head; struct ListNode*fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; } return slow; }