题目:链表的中间结点,给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
链表中间节点
1.分析
- 遍历单链表一遍,定义两个引用
fast
和slow
;fast
表示数度是slow
的两倍,最后一个到结尾,一个就到中间位置了。 fast
一次走两步,slow
一次走一步。- 首先判断
head
是否为空 - 定义两个引用
fast
和slow
都指向头结点 - 因为
fast
一次走两步,所以要判断fast
和fast.next
是否为空,并且fast
必须写在前面,因为如果fast.next
如果写在前面,fast
本身为空就会报空指针异常。为空返回slow
- 不为空的话
fast=fast.next.next;slow=slow.next;
执行5
2.具体步骤
奇数个:
偶数个:
3.代码
public ListNode middleNode() {
//返回中间节点,偶数个返回中间第二个
if (head == null) {
return null;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
测试: