这道题还是比较简单的,最开始的思路是求一下链表的长度length,然后从头开始走length/2即可,当感觉不是很好。便想到了快慢指针的解法。
我们定义两个引用fast和slow(都等于head开始),我们让fast一次走两步(fast=fast.next.next),slow一次走一步**(slow=slow.next)**,这样当fast走完时slow刚还走到一半,此时返回slow即可。但在循环条件的判断上还有一些细节需要我们注意,下面画图来说明。
开始
中间
结尾
while的判断条件必须是 **fast!=null&&fast.next!=null;**不然会引发空指针异常的情况
代码如下:
class Solution {
public ListNode middleNode(ListNode head) {
ListNode slow=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null)
{
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
}