/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
blank //方法一(有些难):
 //首先判空
 //新建快慢指针指向第一个节点
 //在快指针走k个节点的过程中,判断快指针是否指向NULL(因为如果有小于k个节点,在这过程中快指针会指向NULL),是则返回NULL。否则进行下一步
 //然后慢指针和快指针同时移动,当快指针指向NULL时,此时的慢指针指向的节点即为链表倒数第k个节点
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pHead, int k )
 {
    // write code here

    //首先判空
    if(pHead == NULL)
    {
        return NULL;
    }

    //新建快慢指针
    struct ListNode *fast = pHead, *slow = pHead;

    //快指针先走k个节点,判断链表长度是否小于k,小于则返回NULL。否则进行下一步
    for(int i=0; i<k; i++)  //退出循环且能执行下面的代码时,i=k,且fast指针指向链表的第k+1个节点,也可能是NULL
    {
        if(fast == NULL)    //如果节点数小于k,就会出现fast == NULL
        {
            return NULL;
        }
        fast = fast->next;
    }

     //(画图理解)然后慢指针和快指针同时移动,此时慢指针指向第一个节点,他们之间相差k个节点,当快指针指向NULL时,此时的慢指针指向的节点即为链表倒数第k个节点
     while (fast!=NULL) 
     {
        slow = slow->next;
        fast = fast->next;
     }

     return slow;
}