力扣第876题:链表的中间节点
题目描述:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
这个题目很简单,采用快慢指针的方式就可以很快解决。但是笔者在答题时一直出错,现在记录一下。
附上代码:
public ListNode middleNode(ListNode head) {
ListNode slow,fast;
slow=fast=head;
// while(fast.next!=null && fast!=null){ ----错误的方式
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
代码中有两个while语句,但是上一个会一直报错:(如下)
踩坑分析:
当
fast指针已经指向最后一个节点的next值时,即fast指向null时,
- 如果写的是第一种
while循环,那么fast指向的null,就没有next,所以会报空指针异常。 - 如果是第二种
while,条件中先判断fast为null,就不会再执行&&之后的内容,就可以完美规避这个问题。