题目描述
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
https://leetcode.cn/problems/middle-of-the-linked-list/description/
示例
提示:
- 链表的结点数范围是
[1, 100]
1 <= Node.val <= 100
解题总结
- 思路一
遍历链表得到结点数,根据结点数求中间结点所在位置,再次遍历链表
- 思路二
设置两个指针,一个指针为“快指针”,每次前进两个结点,一个指针为“慢指针”,每次前进一个结点,当快指针指向链表尾结点时,慢指针指向链表的中间结点
代码实现
- 思路一的代码实现
struct ListNode* middleNode(struct ListNode* head) {int count = 0;struct ListNode* p = head;while (p != NULL){count++;p = p->next;}int mid = count / 2 + 1;int i = 0;p = head;for(i = 0; i < mid - 1; i++){p = p->next;}return p;
}
- 思路二的代码实现
struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast != NULL && fast->next != NULL) //当快指针和下个结点都不为空时,循环继续{fast = fast->next->next;slow = slow->next;}return slow;
}