题意:
        有一个长度为 n 的链表,输出该链表的后 k 个节点。
          如果该链表长度小于k,请返回一个长度为 0 的链表。


方法一:
思维

思路:求一个链表的后k个节点。
            可以先求链表的总长度,用总长度减去k,就可以得到从前往后顺步走的长度。


class Solution {
public:
    
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        ListNode *p=pHead;
        int n=0;//链表的大小
        while(p!=nullptr){
            n++;
            p=p->next;
        }
        if(n<k)//如果链表小于k,则返回空
            return nullptr;
        n-=k;//总数-倒数的数=顺步走的次数
        
        p=pHead;
        while(n--){//遍历
            p=p->next;
        }
        return p;
    }
};

时间复杂度:
空间复杂度:

方法二:
双指针

思路:
            p指针和q指针都指向头结点,再让q指针移动k步,这样就能让p指针和q指针的间隔是k。
            而后p指针和q指针一起移动,直到q指针到达边界(即null),则输出p指针。


class Solution {
public:
    
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        ListNode *p=pHead,*q=pHead;//初始化
        
        while(k&&q!=nullptr){//先让q指针移动k步,这样就能让p指针和q指针的间隔是k
            k--;
            q=q->next;
        }
        if(k==0){
            while(q!=nullptr){//p指针和q指针一起移动,直到q==null
                p=p->next;
                q=q->next;
            }
            return p;//返回p
        }else{//如果链表小于k,则返回空
            return nullptr;
        }
        
    }
};
时间复杂度:
空间复杂度: