题目描述
输入一个链表,输出该链表中倒数第k个结点。
----------------------------------------------------------------------------------------------------
定义两个指针,一前一后,但是两个指针之间节点长度相差k个,当后一个指针到最后节点时候,相差k个,前一个指针就是到倒数第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 == 0)
{
return nullptr;
}
int node_Count = 1;
ListNode * prePtr = pListHead;
ListNode * lastptr = pListHead;
while (lastptr != NULL)
{
if (node_Count > k && prePtr->next != nullptr)//这个必须的>k,有等于就是不对的,少一个
//必须的判断prePtr = prePtr->next,prePtr只能到最后一个节点
{
prePtr = prePtr->next;
}
lastptr = lastptr->next;
node_Count++;
}
if(node_Count <= k)//这个一开始没加,没想到,当k>节点个数时,会发生这种情况,{1,2,3,4},k=5,这样就得返回nullptr
return nullptr;
return prePtr;
}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if (!pListHead || k == 0)return NULL;
int nodeCount = 0;
ListNode *pre = pListHead;
ListNode *last = pListHead;
while (pre)
{
while (pre && nodeCount < k)
{
pre = pre->next;
nodeCount++;
}
if (pre)
{
pre = pre->next;
last = last->next;
nodeCount++;
}
}
if (nodeCount < k)return NULL;
return last;
}
};