while(cur.next != null )会报错,而while(cur !=null)不会

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k <= 0){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        
        while(k-- != 0){
            if(fast != null){
            fast = fast.next;
        }else return null;
         
        }
        while(fast != null ){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

最后一个循环中,为什么用fast.next != null 会出错呢?遍历到达的位置不是一样的吗

一、简单的验证

1. 假设k=1

2. 第一个while循环之后,k=0,fast = null

3. 第二个while循环,fast.next 即 null.next, 报空异常

 

二、代码分析

while(k-- != 0){
    if(fast != null){
        //猜测是单向链表,最后一个结点的next为null,此处最后回为空
        //除非程序能确保任意结点的next都不为空,如循环链表
        fast = fast.next; 
    }else 
        return null;
         
}

//fast为null,报空异常
while(fast != null ){
    fast = fast.next;
    slow = slow.next;
}