📚博客主页:爱敲代码的小杨.
✨专栏:《java SE语法》 | 《数据结构与算法》 | 《C生万物》
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!
1.题目描述
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例1
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间节点,值为3
示例2
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:链表只有两个中间节点,值分别为3和4,返回第二个节点。
提示
- 链表的节点的范围是
[1,100]
1<= Node.val <= 100
题目链接
2. 思路
- 判断头结点的
next
是否为空,如果是直接返回头结点 - 定义两个指针
slow
和fast
,都指向头结点。 - 循环遍历链表,每次
fast
指向fast
的next
的next
(每次移动两步);slow
指向slow
的next
(每次移动1步) - 循环条件:
fast == null
循环结束(链表元素个数为偶数时),fast.next == null
循环结束(链表元素个数为奇数时)。
3.代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
if (head.next == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
运行结果: