链表中倒数第k个节点

2021-11-11  本文已影响0人  gaookey

题目:输入一个链表,输出该链表中倒数第么k个节点。为了符合大多数人的习惯,本题从 1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

为了实现只遍历链表一次就能找到倒数第 k 个节点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走 k-1 步,第二个指针保持不动;从第 k 步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在 k-1,当第一个(走在前面的)指针到达链表的尾节点时,第二个(走在后面的)指针正好指向倒数第 k 个节点。

struct ListNode {
    int m_nValue;
    ListNode* m_pNext;
};

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
    // 输入的 pListHead 为空指针
    // 输入的参数k为0
    if(pListHead == nullptr || k == 0)
        return nullptr;
    
    ListNode *pAhead = pListHead;
    ListNode *pBehind = nullptr;
    
    for(unsigned int i = 0; i < k - 1; ++ i)
    {
        if(pAhead->m_pNext != nullptr)
            pAhead = pAhead->m_pNext;
        else
        {
            return nullptr; // 链表的节点数少于k
        }
    }
    
    pBehind = pListHead;
    while(pAhead->m_pNext != nullptr)
    {
        pAhead = pAhead->m_pNext;
        pBehind = pBehind->m_pNext;
    }
    
    return pBehind;
}

摘抄资料:《剑指offer》

上一篇下一篇

猜你喜欢

热点阅读