解题思路:
通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置。
解法一
- 遍历链表,得到结点个数
- 再次遍历,返回中间结点
时间复杂度 : O(N)
解法二
快慢指针法。
- 快指针一次走两步
- 慢指针一次走一步
初始条件
奇数个结点结束状态
偶数个结点结束状态
所以结束条件
fast == NULL || fast->next == NULL
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* slow, *fast;
slow = fast = head;
while(fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}
return slow;
}