题目描述   输入一个链表,输出该链表中倒数第k个结点。

   

   关于这个题目,有一个比较好的博客推荐https://www.cnblogs.com/General-up/p/5392358.html,它的分析部分特别清晰。

 求链表的倒数第K个节点:主要思路设置两个指针,刚开始都指向链表的第一个节点,第一个指针先走k-1步,然后两个一块走,直到第一个指针的下一位为nullptr,则 第二个指针所指的位置就是倒数第k个节点。

   尤其想说的是,大家一定要注意边界条件,我第一次在牛客上提交的时候,就是没有考虑 k = 0的情况,导致代码不通过。

 

 呈上完整代码。

#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
struct ListNode
{
    int val;
    struct ListNode *next;
    ListNode(int n) : val(n), next(NULL) { };
};
ListNode *findKthToTail(ListNode *pListHead, unsigned int k)
{
    if (k == 0)        //当k为空时,返回为空
        return NULL;
    if (pListHead == NULL)    //当链表为空时,返回为空
        return NULL;
    ListNode *first = pListHead;
    ListNode *second = pListHead;
    for (int i = 1; i < k; i++)
    {
        if (first->next == NULL)    //当k的长度大于链表长度时,返回空
            return NULL;
        first = first->next;
    }
    while (first->next != NULL)
    {
        first = first->next;
        second = second->next;
    }
    cout << "倒数第 " << k << " 个值为:" << second->val << endl;
    return second;
    

}
//创建结点数为n的单链表
ListNode* createList(int n)
{
    ListNode *head;
    head = (ListNode*)malloc(sizeof(ListNode));
    ListNode *q;
    q = head;
    srand(time(0));
    for(int i = 0; i < n; i++)
    {
        ListNode *p = (ListNode*)malloc(sizeof(ListNode));
        p->val = rand() % 100 + 1;
        q->next = p;
        q = p;
    }
    q->next = NULL;
    return head;
}
//打印单链表
void print(ListNode *head)
{
    if (head == NULL)
        cout << "The list is NULL";
    ListNode *p = head->next;
    while (p != NULL)
    {
        cout << p->val << " ";
        p = p->next;
    }
    cout << endl;
}

int main()
{
    int n = 10;
    ListNode *singleList = NULL;
    singleList = createList(n);
    print(singleList);
    findKthToTail(singleList, 3);

    system("pause");
    return 0;
}