思路:

用两种方法:
1.设一个pre在p跑了k个单位后再一起移动到结尾
2.直接把整个list给反转过来,三指针,练手,这里会输出node[k]之后所有所以不能用(这种跟递归差不多,但直接递归无法处理返回ind和返回node,封装个专门回传的对象应该可以,还有就是存入栈那空间换时间)

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};
//2:12--2:39
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *p = pListHead;
        while(k--){
            if(pListHead == NULL)//居然会出越界的k。。。
                return NULL;
            pListHead = pListHead->next;
        }
        while(pListHead != NULL){
            pListHead = pListHead->next;
            p = p->next;
        }
        return p;
    }
};
//2:44--3:00
//这个版本在输出的时候发现node[k]下面的所有节点也别输出了,所以他是遍历node[k]下面的节点的,逆序不能用
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode* head=NULL, *mid=pListHead, *tail=NULL;
        if(pListHead == NULL)
            return NULL;
        else
            tail=pListHead->next;
        while(mid != NULL){
            mid->next=head;
            head = mid;
            mid = tail;
            tail = tail->next;
        }
        while(head!=NULL&&--k){
            head=head->next;
        }
        return head;
    }
};