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;
}