【剑指Offer】【链表】链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。
A1:先从头到尾扫描链表,得到链表的总长度n,然后再扫描一次链表,输出n-k+1处的结点 ===> 测试用例超时
A2:创建两个指针,一个遍历链表到k处,若链表已指向空,则返回false
到k处后,进入第二个循环,指针A与指针B一起向后移动,当指针A指向nullptr时返回,结果为指针B指向的结点
因为指针A和指针B一直保持k距离
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if ((pListHead == nullptr) || (k < 1))
{
return nullptr;
}
ListNode* pNodeA = pListHead;
ListNode* pNodeB = pListHead;
while (k > 0)
{
if (pNodeA == nullptr)
{
return nullptr;
}
pNodeA = pNodeA->next;
k--;
}
while (pNodeA != nullptr)
{
pNodeA = pNodeA->next;
pNodeB = pNodeB->next;
}
return pNodeB;
}
};

//这个解法,是两个指针距离保持在k-1的,在VS下成功通过,但是在牛客编辑器中说有段错误,很奇怪
//和上一个解法差不多相同
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if ((pListHead == nullptr) || (k < 1))
{
return nullptr;
}
ListNode* pNodeA = pListHead;
ListNode* pNodeB = pListHead;
ListNode* pNodeA = pListHead;
ListNode* pNodeB = pListHead;
while (k > 1)
{
if (pNodeA == nullptr)
{
return nullptr;
}
pNodeA = pNodeA->next;
k--;
}
while (pNodeA->next != nullptr)
{
pNodeA = pNodeA->next;
pNodeB = pNodeB->next;
}
return pNodeB;
}

浙公网安备 33010602011771号