剑指offer-15.链表中倒数第k个节点

0 题目

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

1 分析

经典的双指针题。

一个指针,当k==0的时候,每次循环向下走一步,知道另一个指针为nullptr

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{
    ListNode *ret = pListHead;
    ListNode *end = pListHead;

    while (end != nullptr)
    {
        if (k == 0)
        { //ret 在k=0的时候,表示 end 已经先走了k步
            ret = ret->next;
        }
        else
        {
            --k;
        }
        end = end->next;
    }
    // 在end==nullptr 的时候k还不为0 ,也就是end还没走上k步。
    // 也就是说链表长度不足k
    if (k != 0)
    {
        return nullptr;
    }
    else
    {
        return ret;
    }
}

  

或者是另一种写法

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{
    ListNode *pre = pListHead;
    ListNode *cur = pListHead;

    // pre 先走k步,如果pre==nullptr那么就return nullptr
    // 原因在于链表没有k那么长
    for (int i = 0; i < k; i++)
    {
        if (pre == nullptr)
        {
            return nullptr;
        }
        pre = pre->next;
    }

    while (pre != nullptr)
    {
        pre = pre->next;
        cur = cur->next;
    }

    return cur;
}

  

原文地址:https://www.cnblogs.com/perfy576/p/8607005.html